gd-sprest-js
Version:
SharePoint 2013/Online js components.
416 lines (415 loc) • 17.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var gd_sprest_1 = require("gd-sprest");
var __1 = require("..");
var _1 = require(".");
// Extend the list form
exports.ListForm = gd_sprest_1.Helper.ListForm;
// Method to render the attachments view
exports.ListForm.renderAttachmentsView = function (props) {
var attachments = props.info.attachments || [];
// Render the list
var renderList = function (el) {
var items = [];
// Parse the attachments
for (var i = 0; i < attachments.length; i++) {
var attachment = attachments[i];
// Add the item
items.push({
primaryText: attachment.FileName,
actions: [{
iconName: "Download",
url: attachment.ServerRelativeUrl
}]
});
}
// Render the list
__1.Fabric.List({
el: el,
items: items
});
};
// Method to render the menu
var renderMenu = function (el) {
// Render a command bar
__1.Fabric.CommandBar({
el: el,
mainCommands: [{
text: "Upload",
onClick: function () {
// Show a spinner
__1.Fabric.Spinner({
el: props.el,
text: "Saving the attachment..."
});
// Show the file dialog
exports.ListForm.showFileDialog(props.info).then(function () {
// Render the list
renderList(props.el.children[1]);
// Call the save event
props.onSave ? props.onSave(props.info) : null;
});
}
}]
});
};
// Render the template
props.el.innerHTML = "<div></div><div></div>";
// Render the menu
renderMenu(props.el.children[0]);
// Render the list
renderList(props.el.children[1]);
};
// Method to render a display form for an item
exports.ListForm.renderDisplayForm = function (props) {
var fields = [];
// Render the form template
exports.ListForm.renderFormTemplate(props);
// Load the list item
props.info.list.Items(props.info.item.Id)
// Get the html for the fields
.FieldValuesAsHtml()
// Execute the request
.execute(function (formValues) {
var hasUserField = false;
// Parse the fields
for (var fieldName in props.info.fields) {
// Get the element
var elField = props.el.querySelector("[data-field='" + fieldName + "']");
if (elField) {
var field = props.info.fields[fieldName];
var html = formValues[fieldName] || formValues[fieldName.replace(/\_/g, "_x005f_")] || "";
// Set the flag
hasUserField = hasUserField || field.FieldTypeKind == gd_sprest_1.SPTypes.FieldType.User;
// Set the html for this field
elField.innerHTML = [
'<div class="display-form">',
__1.Fabric.Templates.Label({
className: "field-label",
description: field.Description,
text: field.Title
}),
'<div class="field-value">' + html.replace(/\r?\n/g, '<br/>') + '</div>',
'</div>'
].join('\n');
// Add this field
fields.push(elField);
}
}
// See if we are displaying a user field
if (hasUserField) {
// Enable the persona
window["ProcessImn"]();
}
});
// Return the form
return {
getFields: function () { return fields; }
};
};
// Render the edit form
exports.ListForm.renderEditForm = function (props) {
var controlMode = typeof (props.controlMode) === "number" ? props.controlMode : props.info.item ? gd_sprest_1.SPTypes.ControlMode.Edit : gd_sprest_1.SPTypes.ControlMode.New;
var fields = [];
// Render the form template
exports.ListForm.renderFormTemplate(props);
// Parse the fields
for (var fieldName in props.info.fields) {
var field = props.info.fields[fieldName];
var value = props.info.item ? props.info.item[fieldName] : null;
// Get the field element and ensure it exists
var elField = props.el.querySelector("[data-field='" + fieldName + "']");
if (elField == null) {
continue;
}
// See if this is a read-only field
if (field.ReadOnlyField) {
// Do not render in the new form
if (props.controlMode == gd_sprest_1.SPTypes.ControlMode.New) {
continue;
}
}
// See if this is the hidden taxonomy field
if (field.Hidden && field.FieldTypeKind == gd_sprest_1.SPTypes.FieldType.Note && field.Title.endsWith("_0")) {
// Do not render this field
continue;
}
// See if this is an invalid field type
if (field.FieldTypeKind == gd_sprest_1.SPTypes.FieldType.Invalid) {
// Ensure it's not a taxonomy field
if (!field.TypeAsString.startsWith("TaxonomyFieldType")) {
continue;
}
}
// Render the field
_1.Field({
controlMode: controlMode,
el: elField,
fieldInfo: {
field: field,
listName: props.info.list.Title,
name: fieldName,
webUrl: props.info.webUrl
},
value: value
}).then(function (field) {
// Add the field
fields.push(field);
});
}
// Method to get the form values
var getFormValues = function () {
var formValues = {};
var unknownUsers = {};
// Parse the fields
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldName = field.fieldInfo.name;
var fieldValue = field.element.getValue();
// Update the field name/value, based on the type
switch (field.fieldInfo.type) {
// Choice
case gd_sprest_1.SPTypes.FieldType.Choice:
// Update the field value
fieldValue = fieldValue && fieldValue.length > 0 ? fieldValue[0].value : null;
break;
// Lookup
case gd_sprest_1.SPTypes.FieldType.Lookup:
// Append 'Id' to the field name
fieldName += fieldName.lastIndexOf("Id") == fieldName.length - 2 ? "" : "Id";
// See if this is a multi-value field
if (field.fieldInfo.multi) {
var values = fieldValue || [];
fieldValue = { results: [] };
// Parse the options
for (var j = 0; j < values.length; j++) {
// Add the value
fieldValue.results.push(values[j].value);
}
}
else {
// Update the field value
fieldValue = fieldValue && fieldValue.length > 0 ? fieldValue[0].value : fieldValue;
}
break;
// Multi-Choice
case gd_sprest_1.SPTypes.FieldType.MultiChoice:
var options = fieldValue || [];
fieldValue = { results: [] };
// Parse the options
for (var j = 0; j < options.length; j++) {
// Add the option
fieldValue.results.push(options[j].value);
}
break;
// URL
case gd_sprest_1.SPTypes.FieldType.URL:
// See if the field value exists
if (fieldValue) {
// Add the metadata
fieldValue.__metadata = { type: "SP.FieldUrlValue" };
}
break;
// User
case gd_sprest_1.SPTypes.FieldType.User:
// Append 'Id' to the field name
fieldName += fieldName.lastIndexOf("Id") == fieldName.length - 2 ? "" : "Id";
// See if this is a multi-value field
if (field.fieldInfo.multi) {
var values = fieldValue || [];
fieldValue = { results: [] };
// Parse the options
for (var j = 0; j < values.length; j++) {
var userValue = values[j];
if (userValue && userValue.EntityData) {
// Ensure the user or group id exists
if (userValue.EntityData.SPGroupID || userValue.EntityData.SPUserID) {
// Update the field value
fieldValue.results.push(userValue.EntityData.SPUserID || userValue.EntityData.SPGroupID);
}
else {
// Add the unknown user account
unknownUsers[fieldName] = unknownUsers[fieldName] || [];
unknownUsers[fieldName].push(userValue.Key);
}
}
}
}
else {
var userValue = fieldValue ? fieldValue[0] : null;
if (userValue && userValue.EntityData) {
// Ensure the user or group id exists
if (userValue.EntityData.SPGroupID || userValue.EntityData.SPUserID) {
// Update the field value
fieldValue = userValue.EntityData.SPUserID || userValue.EntityData.SPGroupID;
}
else {
// Add the unknown user account
unknownUsers[fieldName] = unknownUsers[fieldName] || [];
unknownUsers[fieldName].push(userValue.Key);
}
}
else {
// Clear the field value
fieldValue = null;
}
}
break;
// MMS
default:
if (field.fieldInfo.typeAsString.startsWith("TaxonomyFieldType")) {
// See if this is a multi field
if (field.fieldInfo.typeAsString.endsWith("Multi")) {
// Update the field name to the value field
fieldName = field.fieldInfo.valueField.InternalName;
// Parse the field values
var fieldValues = fieldValue || [];
fieldValue = [];
for (var j = 0; j < fieldValues.length; j++) {
var termInfo = fieldValues[j];
// Add the field value
fieldValue.push(-1 + ";#" + termInfo.text + "|" + termInfo.value);
}
// Set the field value
fieldValue = fieldValue.join(";#");
}
else {
// Update the value
fieldValue = fieldValue && fieldValue.length > 0 ? {
__metadata: { type: "SP.Taxonomy.TaxonomyFieldValue" },
Label: fieldValue[0].text,
TermGuid: fieldValue[0].value,
WssId: -1
} : fieldValue;
}
}
break;
}
// Set the field value
formValues[fieldName] = fieldValue;
}
// Return the form values
return { formValues: formValues, unknownUsers: unknownUsers };
};
// Return the form
return {
// Returns the fields
getFields: function () { return fields; },
// Returns the field values
getValues: function () {
// Return a promise
return new Promise(function (resolve, reject) {
var _a = getFormValues(), formValues = _a.formValues, unknownUsers = _a.unknownUsers;
var web = gd_sprest_1.Web();
// Parse the field names
for (var fieldName in unknownUsers) {
// Parse the user accounts
for (var i = 0; i < unknownUsers[fieldName].length; i++) {
// Ensure this user account exists
web.ensureUser(unknownUsers[fieldName][i]).execute(true);
}
}
// Wait for the requests to complete
web.done(function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
// Parse the field names
for (var fieldName in unknownUsers) {
// Parse the user accounts
for (var i = 0; i < unknownUsers[fieldName].length; i++) {
var userLogin = unknownUsers[fieldName][i];
// Parse the responses
for (var j = 0; j < args.length; j++) {
var user = args[j];
// See if this is the user
if (user.LoginName == userLogin) {
// See if this is a multi-user value
if (formValues[fieldName].results != null) {
// Set the user account
formValues[fieldName].push(user.Id);
}
else {
// Set the user account
formValues[fieldName] = user.Id;
}
}
}
}
}
// Resolve the promise
resolve(formValues);
});
});
},
// Flag to determine if the form is valid
isValid: function () {
var formValues = getFormValues().formValues;
// Parse the fields
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
// See if this field is required
if (field.fieldInfo.required) {
// Ensure a value exists
if (formValues[field.fieldInfo.name]) {
continue;
}
// Form is invalid
return false;
}
}
// Form is valid
return true;
}
};
};
// Method to render the form template
exports.ListForm.renderFormTemplate = function (props) {
// Clear the element
props.el.innerHTML = "";
// See if the field order has been specified
if (props.includeFields) {
// Parse the fields to include
for (var i = 0; i < props.includeFields.length; i++) {
// Parse the fields
for (var fieldName in props.info.fields) {
// See if we are including this field
if (props.includeFields[i] == fieldName) {
// Append the field to the form
props.el.innerHTML += "<div data-field='" + fieldName + "'></div>";
break;
}
}
}
}
// Else, see if fields have been specified to be excluded
else if (props.excludeFields) {
// Parse the fields
for (var fieldName in props.info.fields) {
var excludeField = props.includeFields ? true : false;
// Parse the fields
for (var i = 0; i < props.excludeFields.length; i++) {
// See if we are excluding this field
if (props.excludeFields[i] == fieldName) {
// Set the flag
excludeField = true;
break;
}
}
// See if we are excluding the field
if (excludeField) {
continue;
}
// Append the field to the form
props.el.innerHTML += "<div data-field='" + fieldName + "'></div>";
}
}
else {
// Parse the fields
for (var fieldName in props.info.fields) {
// Append the field to the form
props.el.innerHTML += "<div data-field='" + fieldName + "'></div>";
}
}
};