gd-sprest-bs
Version:
SharePoint JavaScript, TypeScript and Web Components designed using the Bootstrap framework.
156 lines (137 loc) • 5.64 kB
text/typescript
import { Components } from "gd-bs";
import { SPTypes, Types } from "gd-sprest";
import { IWPSearchCfg, IWPSearchEditForm, IWPSearchInfo } from "./types";
/**
* Search WebPart Edit Form
*/
export const WPSearchEditForm = (props: IWPSearchEditForm = {}): IWPSearchEditForm => {
let _wpInfo: IWPSearchInfo = null;
// Method to render the fields
let loadFields = (list: Types.SP.IListQuery) => {
let formControls: Array<Components.IFormControlPropsMultiDropdown> = [];
let items: Array<Components.IDropdownItem> = [];
// Ensure the list exists
if (list == null) { return formControls; }
// Parse the fields
let fields = (list.Fields ? list.Fields.results : null) || [];
for (let i = 0; i < fields.length; i++) {
let addField = false;
let field = fields[i];
// Add the field, based on the type
switch (field.FieldTypeKind) {
// Searchable Fields
case SPTypes.FieldType.Choice:
case SPTypes.FieldType.MultiChoice:
case SPTypes.FieldType.Lookup:
case SPTypes.FieldType.Text:
case SPTypes.FieldType.URL:
case SPTypes.FieldType.User:
addField = true;
break;
default:
// Allow managed metadata fields
addField = /^TaxonomyFieldType/.test(field.TypeAsString);
break;
}
// See if we are adding the field
if (addField) {
items.push({
data: field.TypeAsString,
text: field.Title + " [" + field.InternalName + "]",
value: field.InternalName
});
}
}
// Sort the options
items = items.sort((a, b) => {
if (a.text < b.text) { return -1; }
if (a.text > b.text) { return 1; }
return 0;
});
// See if fields exist
let value = [];
if (_wpInfo.cfg && _wpInfo.cfg.Fields) {
// Parse the fields
for (let i = 0; i < _wpInfo.cfg.Fields.length; i++) {
// Add the field
value.push(_wpInfo.cfg.Fields[i].name);
}
}
// Add the form dropdown
formControls.push({
label: "Filter Field(s):",
items,
type: Components.FormControlTypes.MultiDropdown,
onChange: (items: Array<Components.IDropdownItem>) => {
// Clear the fields
_wpInfo.cfg.Fields = [];
// Parse the options
for (let i = 0; i < items.length; i++) {
let item = items[i];
// Add the field
_wpInfo.cfg.Fields.push({
name: item.value,
type: item.data
});
}
}
});
// Return the form controls
return formControls;
}
// Set the list query
let listQuery: Types.IODataQuery = props.listQuery || {};
listQuery.Expand = listQuery.Expand || [];
listQuery.Expand.push("Fields");
// Return the edit panel
return {
actions: props.actions,
listQuery,
onListsLoaded: props.onListsLoaded,
onRenderForm: (wpInfo, list: Types.SP.IListQuery) => {
// Return a promise
return new Promise((resolve, reject) => {
// Save the webpart information
_wpInfo = wpInfo;
// Load the fields
let formControls = loadFields(list);
// 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); }
});
},
showSaveButton: props.showSaveButton,
onListChanged: (wpInfo: IWPSearchInfo, list: Types.SP.IListQuery) => {
// Render the fields
return loadFields(list);
},
onSave: (cfg: IWPSearchCfg, form) => {
// Update the configuration
cfg.Fields = _wpInfo.cfg.Fields || [];
// Return the configuration
return props.onSave ? props.onSave(_wpInfo.cfg, form) : _wpInfo.cfg;
}
}
}