gd-sprest-bs
Version:
SharePoint JavaScript, TypeScript and Web Components designed using the Bootstrap framework.
283 lines (252 loc) • 11.7 kB
text/typescript
import { Components } from "gd-bs";
import { Helper } from "gd-sprest";
import { IWPTaxonomyInfo, IWPTaxonomyEditForm, IWPTaxonomyCfg } from "./types";
/**
* Taxonomy WebPart Edit Form
*/
export const WPTaxonomyEditForm = (props: IWPTaxonomyEditForm = {}): IWPTaxonomyEditForm => {
let _ddlTermSet: Components.IDropdown;
let _ddlTerm: Components.IDropdown;
let _termGroupItems: Array<Components.IDropdownItem> = [];
let _termSetItems: Array<Components.IDropdownItem> = [];
let _termSetTermsItems: Array<Components.IDropdownItem> = [];
let _wpInfo: IWPTaxonomyInfo = null;
// Method to generate the form controls
let generateFormControls = (): Array<Components.IFormControlPropsDropdown> => {
let formControls: Array<Components.IFormControlPropsDropdown> = [];
// Add the term groups dropdown
formControls.push({
label: "Select the Term Group:",
items: _termGroupItems,
name: "TermGroupId",
type: Components.FormControlTypes.Dropdown,
value: _wpInfo.cfg.TermGroupId,
onChange: (option: Components.IDropdownItem) => {
// Clear the dropdowns
_termSetItems = [];
_termSetTermsItems = [];
_ddlTermSet.setItems([]);
_ddlTerm ? _ddlTerm.setItems([]) : null;
// Update the configuration
_wpInfo.cfg.TermGroupId = option ? option.value : "";
_wpInfo.cfg.TermGroupName = option ? option.text : "";
_wpInfo.cfg.TermSetId = "";
_wpInfo.cfg.TermSetName = "";
_wpInfo.cfg.TermSetTermId = "";
_wpInfo.cfg.TermSetTermName = "";
// Call the change event
props.onTermGroupChanged ? props.onTermGroupChanged(_wpInfo, { id: _wpInfo.cfg.TermGroupId, name: _wpInfo.cfg.TermGroupName }) : null;
// Load the term sets
loadTermSets().then(() => {
// Render the child dropdowns
_ddlTermSet.setItems(_termSetItems);
});
}
});
// Add the term sets dropdown
formControls.push({
label: "Select a Term Set:",
items: _termSetItems,
name: "TermSetId",
type: Components.FormControlTypes.Dropdown,
value: _wpInfo.cfg.TermSetId,
onControlRendered: (control) => {
// Save a reference to the dropdown
_ddlTermSet = control.dropdown;
},
onChange: (option: Components.IDropdownItem) => {
// Clear the dropdown
_termSetTermsItems = [];
_ddlTerm ? _ddlTerm.setItems([]) : null;
// Update the configuration
_wpInfo.cfg.TermSetId = option ? option.value : "";
_wpInfo.cfg.TermSetName = option ? option.text : "";
_wpInfo.cfg.TermSetTermId = "";
_wpInfo.cfg.TermSetTermName = "";
// Call the change event
props.onTermSetChanged ? props.onTermSetChanged(_wpInfo, { id: _wpInfo.cfg.TermSetId, name: _wpInfo.cfg.TermSetName }) : null;
// See if we are loading the terms
if (props.showTermSetTerms) {
// Load the term set terms
loadTermSetTerms().then(() => {
// Render the child dropdowns
_ddlTerm.setItems(_termSetTermsItems);
});
}
}
});
// Ensure we are rendering the term set terms
if (props.showTermSetTerms) {
// Add the term set terms dropdown
formControls.push({
label: "Select a Term Set Term:",
items: _termSetTermsItems,
name: "TermSetTermId",
type: Components.FormControlTypes.Dropdown,
value: _wpInfo.cfg.TermSetTermId,
onControlRendered: (control) => {
// Save a reference to the dropdown
_ddlTerm = control.dropdown;
},
onChange: (option: Components.IDropdownItem) => {
// Update the configuration
_wpInfo.cfg.TermSetTermId = option ? option.value : "";
_wpInfo.cfg.TermSetTermName = option ? option.text : "";
// Call the change event
props.onTermSetTermChanged ? props.onTermSetTermChanged(_wpInfo, { id: _wpInfo.cfg.TermSetTermId, name: _wpInfo.cfg.TermSetTermName }) : null;
}
});
}
// Return the form controls
return formControls;
}
// Method to load the term groups
let loadTermGroups = (): PromiseLike<Array<Components.IFormControlPropsDropdown>> => {
// Return a promise
return new Promise((resolve, reject) => {
// Load the term groups
Helper.Taxonomy.getTermGroups().then(groups => {
_termGroupItems = [{
text: "",
value: ""
}];
// Parse the groups
for (let i = 0; i < groups.length; i++) {
// Add the item
_termGroupItems.push({
text: groups[i].name,
value: groups[i].id
});
}
// Load the term sets
loadTermSets().then(() => {
// Execute the term groups loaded event
_termGroupItems = props.onTermGroupsLoaded ? props.onTermGroupsLoaded(_wpInfo, _termGroupItems) : _termGroupItems;
// Resolve the promise
resolve(generateFormControls());
});
});
});
}
// Method to load the term sets
let loadTermSets = (): PromiseLike<void> => {
// Return a promise
return new Promise((resolve, reject) => {
// See if a term group exists
if (_wpInfo.cfg.TermGroupName) {
// Load the term sets
Helper.Taxonomy.getTermSets(_wpInfo.cfg.TermGroupName).then(termSets => {
_termSetItems = [{
text: "",
value: ""
}];
// Parse the term sets
for (let i = 0; i < termSets.length; i++) {
// Add the item
_termSetItems.push({
text: termSets[i].name,
value: termSets[i].id
});
}
// Load the term set terms and resolve the promise
loadTermSetTerms().then(() => {
// Execute the term sets loaded event
_termSetItems = props.onTermSetsLoaded ? props.onTermSetsLoaded(_wpInfo, _termSetItems) : _termSetItems;
// Resolve the promise
resolve();
});
});
} else {
// Resolve the promise
resolve();
}
});
}
// Method to load the term set terms
let loadTermSetTerms = (): PromiseLike<void> => {
// Return a promise
return new Promise((resolve, reject) => {
// Ensure we are displaying term set terms and a term set is selected
if (props.showTermSetTerms && _wpInfo.cfg.TermSetId) {
// Load the term set terms
Helper.Taxonomy.getTermSetByGroupName(_wpInfo.cfg.TermSetName, _wpInfo.cfg.TermGroupName).then(termSet => {
_termSetTermsItems = [{
text: "",
value: ""
}];
// Get the term set terms
let terms = Helper.Taxonomy.toArray(termSet).sort((a, b) => {
if (a.name < b.name) { return -1; }
if (a.name > b.name) { return 1; }
return 0;
});
// Parse the term set terms
for (let i = 0; i < terms.length; i++) {
// Add the item
_termSetTermsItems.push({
text: terms[i].name,
value: terms[i].id
});
}
// Execute the term sets loaded event
_termSetTermsItems = props.onTermSetTermsLoaded ? props.onTermSetTermsLoaded(_wpInfo, _termSetTermsItems) : _termSetTermsItems;
// Resolve the promise
resolve();
});
} else {
// Resolve the promise
resolve();
}
});
}
// Return the edit panel
return {
actions: props.actions,
onRenderForm: (wpInfo) => {
// Return a promise
return new Promise((resolve, reject) => {
// Save the webpart information
_wpInfo = wpInfo;
// Load the term groups
loadTermGroups().then(formControls => {
// Call the render form event
let returnVal: any = props.onRenderForm ? props.onRenderForm(_wpInfo) : null;
if (returnVal) {
// See if this is a promise
if (returnVal.then) {
// Wait for the promise to complete
returnVal.then((controls = []) => {
// Add the form controls
formControls = formControls.concat(controls);
// Resolve the promise
resolve(formControls);
});
}
// Else, see if the form controls exist
else if (returnVal.length > 0) {
// Add the form controls
formControls = formControls.concat(returnVal);
// Resolve the promise
resolve(formControls);
}
// Else, resolve the promise
else { resolve(formControls); }
}
// Else, resolve the promise
else { resolve(formControls); }
});
});
},
onSave: (cfg: IWPTaxonomyCfg, form) => {
// Update the configuration
cfg.TermGroupId = _wpInfo.cfg.TermGroupId;
cfg.TermGroupName = _wpInfo.cfg.TermGroupName;
cfg.TermSetId = _wpInfo.cfg.TermSetId;
cfg.TermSetName = _wpInfo.cfg.TermSetName;
cfg.TermSetTermId = _wpInfo.cfg.TermSetTermId;
cfg.TermSetTermName = _wpInfo.cfg.TermSetTermName;
// Return the configuration
return props.onSave ? props.onSave(_wpInfo.cfg, form) : _wpInfo.cfg;
}
};
}