File tree Expand file tree Collapse file tree 6 files changed +101
-4
lines changed
Rock.JavaScript.Obsidian.Blocks/src/Example/ControlGallery
Rock.JavaScript.Obsidian/Framework/Controls Expand file tree Collapse file tree 6 files changed +101
-4
lines changed Original file line number Diff line number Diff line change 33 :importCode="importCode"
44 :exampleCode="exampleCode"
55 enableReflection>
6- <CategoryPicker label="Category Picker" v-model="value" :multiple="multiple" :entityTypeGuid="entityTypeGuid" />
6+ <CategoryPicker label="Category Picker"
7+ v-model="value"
8+ :multiple="multiple"
9+ :entityTypeGuid="entityTypeGuid"
10+ :selectFirstByDefault="selectFirstByDefault" />
711
812 <template #settings>
913
1014 <div class="row">
1115 <div class="col-md-6">
1216 <CheckBox label="Multiple" v-model="multiple" />
17+ <CheckBox label="Select First By Default" v-model="selectFirstByDefault" />
1318 </div>
1419 <div class="col-md-6">
1520 <EntityTypePicker label="For Entity Type" v-model="entityType" enhanceForLongLists showBlankItem />
3944 return toGuidOrNull(entityType?.value?.value) ?? undefined;
4045 });
4146 const multiple = ref(false);
47+ const selectFirstByDefault = ref(false);
4248 const value = ref(null);
4349 const importCode = getSfcControlImportPath("categoryPicker");
4450 const exampleCode = `<CategoryPicker label="Category Picker" v-model="value" :multiple="false" :entityTypeGuid="entityTypeGuid" />`;
45- </script>
51+ </script>
Original file line number Diff line number Diff line change 44 :exampleCode="exampleCode"
55 enableReflection>
66
7- <CategoryTree v-model="value" :multiple="multiple" :entityTypeGuid="entityTypeGuid" :enableDeselect="enableDeselect" />
7+ <CategoryTree v-model="value"
8+ :multiple="multiple"
9+ :entityTypeGuid="entityTypeGuid"
10+ :enableDeselect="enableDeselect"
11+ :selectFirstByDefault="selectFirstByDefault" />
812
913 <template #settings>
1014 <div class="row">
1317 </div>
1418 <div class="col-md-4">
1519 <CheckBox label="Enable Deselection" v-model="enableDeselect" />
20+ <CheckBox label="Select First By Default" v-model="selectFirstByDefault" />
1621 </div>
1722 <div class="col-md-4">
1823 <EntityTypePicker label="For Entity Type" v-model="entityType" enhanceForLongLists showBlankItem />
96101 <td>200px</td>
97102 <td>CSS length value for defining how tall the box is.</td>
98103 </tr>
104+ <tr>
105+ <td><code>selectFirstByDefault</code></td>
106+ <td>Boolean</td>
107+ <td>false</td>
108+ <td>When true, the first item in the list will be automatically selected if no other item is
109+ currently selected.</td>
110+ </tr>
99111 </tbody>
100112 </table>
101113 </template>
120132
121133 const multiple = ref(false);
122134 const enableDeselect = ref(false);
135+ const selectFirstByDefault = ref(false);
123136 const value = ref(null);
124137 const importCode = getSfcControlImportPath("categoryTree");
125138 const exampleCode = computed(() => `<CategoryTree v-model="value"${multiple.value ? " multiple" : ""}${entityTypeGuid.value ? ` entityTypeGuid="${entityTypeGuid.value}"` : ""} />`);
126- </script>
139+ </script>
Original file line number Diff line number Diff line change 44 formGroupClasses="category-picker"
55 iconCssClass="ti ti-folder-open"
66 :provider="itemProvider"
7+ :selectFirstByDefault="selectFirstByDefault"
78 autoExpand
89 :multiple="multiple" />
910</template>
4647 multiple: {
4748 type: Boolean as PropType<boolean>,
4849 default: false
50+ },
51+
52+ /**
53+ * When true, the first item in the list will be automatically selected
54+ * if no other item is currently selected.
55+ */
56+ selectFirstByDefault: {
57+ type: Boolean as PropType<boolean>,
58+ default: false
4959 }
5060 });
5161
8393
8494 // Set the provider to the new one
8595 itemProvider.value = newProvider;
96+
97+ internalValue.value = null;
8698 });
8799
88100 watch(internalValue, () => {
Original file line number Diff line number Diff line change 88 @update:modelValue="onSelect"
99 :disableFolderSelection="disableFolderSelection"
1010 :showChildCount="showChildCount"
11+ :selectFirstByDefault="selectFirstByDefault"
1112 :enableDeselect="enableDeselect"
1213 autoExpand />
1314 </div>
9091 enableDeselect: {
9192 type: Boolean,
9293 default: false
94+ },
95+
96+ /**
97+ * When true, the first item in the list will be automatically selected
98+ * if no other item is currently selected.
99+ */
100+ selectFirstByDefault: {
101+ type: Boolean as PropType<boolean>,
102+ default: false
93103 }
94104 });
95105
225235
226236 // Set the provider to the new one
227237 itemProvider.value = newProvider;
238+
239+ internalValues.value = [];
240+ if (props.multiple) {
241+ emit("update:modelValue", []);
242+ }
243+ else {
244+ emit("update:modelValue", null);
245+ }
228246 });
229247</script>
Original file line number Diff line number Diff line change 1818 :disableFolderSelection="disableFolderSelection"
1919 :autoExpand="autoExpand"
2020 :showChildCount="showChildCount"
21+ :selectFirstByDefault="selectFirstByDefault"
2122 :isVisible="internalShowPopup" />
2223
2324 <template #innerLabel><span class="selected-names">{{ selectedNames || blankValue }}</span></template>
131132 type: String as PropType<string>,
132133 default: ""
133134 },
135+
136+ /**
137+ * When true, the first item in the list will be automatically selected
138+ * if no other item is currently selected.
139+ */
140+ selectFirstByDefault: {
141+ type: Boolean as PropType<boolean>,
142+ default: false
143+ }
134144 });
135145
136146 const emit = defineEmits<{
Original file line number Diff line number Diff line change 9494 enableDeselect: {
9595 type: Boolean,
9696 default: false
97+ },
98+
99+ /**
100+ * When true, the first item in the list will be automatically selected
101+ * if no other item is currently selected.
102+ */
103+ selectFirstByDefault: {
104+ type: Boolean as PropType<boolean>,
105+ default: false
97106 }
98107 });
99108
135144
136145 await nextTick();
137146 scrollToSelectedItem();
147+ trySelectFirst();
138148 }
139149 };
140150
211221 }
212222 };
213223
224+ /**
225+ * Attempts to select the first item if selectFirstByDefault is true and
226+ * no item is currently selected.
227+ */
228+ const trySelectFirst = (): void => {
229+ if (!props.selectFirstByDefault || props.modelValue.length > 0 || internalItems.value.length === 0) {
230+ return;
231+ }
232+
233+ let itemToSelect: TreeItemBag | null = null;
234+
235+ for (const item of internalItems.value) {
236+ if (props.disableFolderSelection && (item.isFolder || item.hasChildren)) {
237+ continue;
238+ }
239+
240+ if (item.value) {
241+ itemToSelect = item;
242+ break;
243+ }
244+ }
245+
246+ if (itemToSelect && itemToSelect.value) {
247+ emit("update:modelValue", [itemToSelect.value]);
248+ }
249+ };
250+
214251 // Watch for a change in our passed items and update our internal list.
215252 watch(() => props.items, () => {
216253 // Only update if we don't have a provider.
217254 if (!props.provider) {
218255 internalItems.value = props.items ?? [];
256+ trySelectFirst();
219257 }
220258 });
221259
You can’t perform that action at this time.
0 commit comments