11<script setup>
2- import { ref } from ' vue' ;
2+ import { ref , computed } from ' vue' ;
33import Head from ' @/pages/layout/Head.vue' ;
4- import { Header , Dropdown , DropdownMenu , DropdownItem , Button , CommandPaletteItem } from ' @ui' ;
4+ import { Header , Dropdown , DropdownMenu , DropdownItem , Button , Modal , RadioGroup , Radio , CommandPaletteItem } from ' @ui' ;
55import ResourceDeleter from ' @/components/ResourceDeleter.vue' ;
66import FormSubmissionListing from ' @/components/forms/SubmissionListing.vue' ;
77
@@ -15,6 +15,46 @@ const props = defineProps([
1515]);
1616
1717const deleter = ref (null );
18+ const submissionListing = ref (null );
19+ const exportModalOpen = ref (false );
20+ const exportFormat = ref (null );
21+ const exportScope = ref (' all' );
22+ const listingParameters = ref ({});
23+
24+ const hasFilteredScope = computed (() => {
25+ const params = listingParameters .value ;
26+ const hasSortOverride = (params .sort && params .sort !== ' datestamp' ) || (params .order && params .order !== ' desc' );
27+ return !! (params .search || params .filters || hasSortOverride);
28+ });
29+
30+ function openExportModal () {
31+ listingParameters .value = submissionListing .value ? .parameters ?? {};
32+ exportFormat .value = props .exporters [0 ]? .handle ?? null ;
33+ exportScope .value = ' all' ;
34+ exportModalOpen .value = true ;
35+ }
36+
37+ function exportSubmissions () {
38+ const exporter = props .exporters .find ((e ) => e .handle === exportFormat .value );
39+ if (! exporter) return ;
40+
41+ let url = exporter .downloadUrl ;
42+
43+ if (exportScope .value === ' filtered' ) {
44+ const params = listingParameters .value ;
45+ const query = new URLSearchParams ();
46+ if (params .search ) query .set (' search' , params .search );
47+ if (params .sort ) query .set (' sort' , params .sort );
48+ if (params .order ) query .set (' order' , params .order );
49+ if (params .filters ) query .set (' filters' , params .filters );
50+
51+ const separator = url .includes (' ?' ) ? ' &' : ' ?' ;
52+ url += separator + query .toString ();
53+ }
54+
55+ window .open (url, ' _blank' );
56+ exportModalOpen .value = false ;
57+ }
1858< / script>
1959
2060< template>
@@ -70,39 +110,51 @@ const deleter = ref(null);
70110 : redirect= " redirectUrl"
71111 / >
72112
73- <Dropdown v-if =" exporters.length" >
74- <template #trigger >
75- <Button :text =" __('Export Submissions')" />
76- </template >
77- <DropdownMenu >
78- <DropdownItem
79- v-for =" exporter in exporters"
80- :key =" exporter.downloadUrl"
81- :text =" exporter.title"
82- :href =" exporter.downloadUrl"
83- target =" _blank"
84- />
85- </DropdownMenu >
86- </Dropdown >
113+ < Button v- if = " exporters.length" : text= " __('Export Submissions')" @click= " openExportModal" / >
87114
88115 < CommandPaletteItem
89- v-for =" exporter in exporters"
90- :key =" exporter.downloadUrl"
116+ v- if = " exporters.length"
91117 category= " Actions"
92- :text =" [ __('Export Submissions'), exporter.title] "
118+ : text= " __('Export Submissions')"
93119 icon= " save"
94- :url = " exporter.downloadUrl "
120+ : action = " openExportModal "
95121 prioritize
96122 / >
97123 < / Header>
98124
99125 < FormSubmissionListing
126+ ref= " submissionListing"
100127 : form= " form.handle"
101128 : action- url= " actionUrl"
102129 sort- column= " datestamp"
103130 sort- direction= " desc"
104131 : columns= " columns"
105- :filters =" filters"
132+ : filters= " filters"
106133 / >
134+
135+ < Modal : open= " exportModalOpen" @update: open= " exportModalOpen = $event" : title= " __('Export Submissions')" >
136+ < div class = " space-y-4" >
137+ < div>
138+ < label class = " text-sm font-medium mb-1.5 block" > {{ __ (' Format' ) }}< / label>
139+ < RadioGroup v- model= " exportFormat" inline>
140+ < Radio v- for = " format in exporters" : key= " format.handle" : value= " format.handle" : label= " format.title" / >
141+ < / RadioGroup>
142+ < / div>
143+
144+ < div>
145+ < label class = " text-sm font-medium mb-1.5 block" > {{ __ (' Submissions' ) }}< / label>
146+ < RadioGroup v- model= " exportScope" >
147+ < Radio value= " all" : label= " __('All Submissions')" / >
148+ < Radio value= " filtered" : label= " __('Filtered Submissions')" : description= " __('statamic::messages.form_export_filtered_description')" : disabled= " !hasFilteredScope" / >
149+ < / RadioGroup>
150+ < / div>
151+ < / div>
152+
153+ < template #footer>
154+ < div class = " flex justify-end p-2" >
155+ < Button variant= " primary" : text= " __('Export')" @click= " exportSubmissions" / >
156+ < / div>
157+ < / template>
158+ < / Modal>
107159 < / div>
108160< / template>
0 commit comments