Skip to content

Commit cfe373c

Browse files
committed
Added decoded fields to result. Added tests. JSLint fixes
Took care of #9 Added more tests to increase coverage Fixed some small JSLint issues
1 parent b377b6a commit cfe373c

35 files changed

+630
-390
lines changed

dist/camlsql.js

Lines changed: 75 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*! camlsqj-js v0.5.1 | (c) dlid.se | https://camlsqljs.dlid.se/license */
1+
/*! camlsqj-js v0.5.2 | (c) dlid.se | https://camlsqljs.dlid.se/license */
22
(function (global, factory) {
33
'use strict';
44
typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory()) :
@@ -215,14 +215,14 @@ var CamlSqlDateParameter = {
215215
stringValue : '',
216216
add : function(intervalString){
217217
this.errstr();
218-
var diff = getIntervalStringAsMs(intervalString)
218+
var diff = getIntervalStringAsMs(intervalString);
219219
this.value = new Date( this.value.getTime() + diff );
220220
this.today = false;
221221
return this;
222222
},
223223
sub : function(intervalString){
224224
this.errstr();
225-
var diff = getIntervalStringAsMs(intervalString)
225+
var diff = getIntervalStringAsMs(intervalString);
226226
this.value = new Date( this.value.getTime() - diff );
227227
this.today = false;
228228
return this;
@@ -295,6 +295,9 @@ var CamlSqlDateParameter = {
295295

296296

297297
function createGuidParameter(value) {
298+
if (typeof value === "undefined") {
299+
throw "[camlsql] Missing parameter";
300+
}
298301
return {
299302
type : 'Guid',
300303
value : value
@@ -325,19 +328,19 @@ function createMembershipParameter(type, id) {
325328
};
326329
}
327330

328-
function createMultiChoiceParameter(value) {
329-
return {
330-
type : 'MultiChoice',
331-
value : value
332-
};
333-
}
331+
// function createMultiChoiceParameter(value) {
332+
// return {
333+
// type : 'MultiChoice',
334+
// value : value
335+
// };
336+
// }
334337

335-
function createChoiceParameter(value) {
336-
return {
337-
type : 'Choice',
338-
value : value
339-
};
340-
}
338+
// function createChoiceParameter(value) {
339+
// return {
340+
// type : 'Choice',
341+
// value : value
342+
// };
343+
// }
341344

342345
// function createUrlParameter(value) {
343346
// return {
@@ -405,7 +408,7 @@ function executeSPQuery(options) {
405408
console.log("[camlsql] Result", rows);
406409
}
407410
}
408-
}
411+
};
409412
}
410413

411414
if (typeof SP !== "undefined") {
@@ -414,12 +417,12 @@ function executeSPQuery(options) {
414417
SP.SOD.executeOrDelayUntilScriptLoaded(function() {
415418

416419

417-
console.warn("GET SERVER TIMEZOE", _spPageContextInfo.webServerRelativeUrl + "/_api/web/RegionalSettings/TimeZone");
420+
// console.warn("GET SERVER TIMEZOE", _spPageContextInfo.webServerRelativeUrl + "/_api/web/RegionalSettings/TimeZone");
418421

419422

420-
ajaxGet(_spPageContextInfo.webServerRelativeUrl + "/_api/web/RegionalSettings/TimeZone", function(e,r) {
421-
console.warn("TZ INFO", e, r);
422-
});
423+
// ajaxGet(_spPageContextInfo.webServerRelativeUrl + "/_api/web/RegionalSettings/TimeZone", function(e,r) {
424+
// console.warn("TZ INFO", e, r);
425+
// });
423426

424427
clientContext = SP.ClientContext.get_current();
425428
if (spWeb !== null) {
@@ -428,7 +431,7 @@ function executeSPQuery(options) {
428431
}
429432
}
430433

431-
if (!spWeb) spWeb = clientContext.get_web();;
434+
if (!spWeb) spWeb = clientContext.get_web();
432435

433436
// regionalSettings = spWeb.get_regionalSettings();
434437
spList = spWeb.get_lists().getByTitle(listName);
@@ -506,7 +509,8 @@ function executeSPQuery(options) {
506509
function camlQuerySuccess() {
507510
var listItemEnumerator = spListItems.getEnumerator(),
508511
items = [],
509-
spListItem;
512+
spListItem,
513+
i;
510514

511515
var listItemCollectionPosition = spListItems.get_listItemCollectionPosition(),
512516
values, field, groupByValue,
@@ -519,21 +523,31 @@ function executeSPQuery(options) {
519523
// var info = timeZone.get_information();
520524
// var offset = (info.get_bias() /*+ (info.get_daylightBias() )*/) / 60.0;
521525
// console.log("TIMEZONE offset", info.get_bias(), info.get_daylightBias(), offset);
522-
526+
523527
while (listItemEnumerator.moveNext()) {
524528
spListItem = listItemEnumerator.get_current();
525529
values = spListItem.get_fieldValues();
526530
if (!prevPage) {
527531
prevPage = "PagedPrev=TRUE&Paged=TRUE&p_ID=" + encodeURIComponent(spListItem.get_id());
528532
}
529533

530-
for(var k in values) {
531-
if (values[k] && typeof values[k].getTimezoneOffset == "function") {
532-
if (k == "DateTime_x0020_field") {
533-
// var o = (values[k].getTimezoneOffset() / 60) * -1 ;
534-
// var d = new Date(values[k].getTime() - ((offset ) * 3600 * 1000));
535-
// console.log(k, "is a date", values[k], values[k].getUTCFullYear(), values[k].getUTCMonth(), values[k].getUTCDate(), values[k].getUTCHours(), values[k].getUTCMinutes(), values[k].getUTCSeconds() );
536-
// console.log(d, "is a date2", d, d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() );
534+
// for(var k in values) {
535+
// if (values[k] && typeof values[k].getTimezoneOffset == "function") {
536+
// if (k == "DateTime_x0020_field") {
537+
// // var o = (values[k].getTimezoneOffset() / 60) * -1 ;
538+
// // var d = new Date(values[k].getTime() - ((offset ) * 3600 * 1000));
539+
// // console.log(k, "is a date", values[k], values[k].getUTCFullYear(), values[k].getUTCMonth(), values[k].getUTCDate(), values[k].getUTCHours(), values[k].getUTCMinutes(), values[k].getUTCSeconds() );
540+
// // console.log(d, "is a date2", d, d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() );
541+
// }
542+
// }
543+
// }
544+
545+
var enc = options.query.$options.parsedQuery.encoded,
546+
encodedFields = Object.keys(options.query.$options.parsedQuery.encoded);
547+
if (encodedFields.length > 0) {
548+
for (i=0; i < encodedFields.length; i++) {
549+
if (typeof values[encodedFields[i]] !== "undefined") {
550+
values[enc[encodedFields[i]]] = values[encodedFields[i]];
537551
}
538552
}
539553
}
@@ -562,7 +576,6 @@ function executeSPQuery(options) {
562576
items[groupIndexes[groupByValue]].items.push(values);
563577
}
564578
} else {
565-
566579
items.push(values);
567580
}
568581
}
@@ -574,22 +587,22 @@ function executeSPQuery(options) {
574587
}
575588

576589

577-
function ajaxGet(url, callback) {
590+
// function ajaxGet(url, callback) {
578591

579-
var xhr = new XMLHttpRequest();
580-
xhr.open('GET', url);
581-
xhr.setRequestHeader('Content-Type', 'application/json');
582-
xhr.setRequestHeader('Accept', 'application/json; odata=verbose');
583-
xhr.onload = function() {
584-
if (xhr.status === 200) {
585-
callback(null, xhr.responseText)
586-
} else {
587-
callback(xhr, null);
588-
}
589-
};
590-
xhr.send();
592+
// var xhr = new XMLHttpRequest();
593+
// xhr.open('GET', url);
594+
// xhr.setRequestHeader('Content-Type', 'application/json');
595+
// xhr.setRequestHeader('Accept', 'application/json; odata=verbose');
596+
// xhr.onload = function() {
597+
// if (xhr.status === 200) {
598+
// callback(null, xhr.responseText)
599+
// } else {
600+
// callback(xhr, null);
601+
// }
602+
// };
603+
// xhr.send();
591604

592-
}
605+
// }
593606

594607
/**
595608
* Add zero padding to a string
@@ -611,9 +624,7 @@ function encodeToInternalField(str) {
611624
for (i=0; i < str.length; i++) {
612625
c = encodeURIComponent(str[i]);
613626
if (c.indexOf('%') == 0) {
614-
n += "_x" + ("0000" + str.charCodeAt(i).toString(16)).slice(-4) + "_"
615-
} else if (c == ' ') {
616-
n += "_x0020_";
627+
n += "_x" + ("0000" + str.charCodeAt(i).toString(16)).slice(-4) + "_";
617628
} else if( c== '.') {
618629
n += "_x002e_";
619630
} else if( c== '(') {
@@ -754,7 +765,7 @@ function parseParameters(param) {
754765
}
755766
} else if (typeof param === "object") {
756767
keys = Object.keys(param);
757-
for (var i=0; i < keys.length; i++) {
768+
for (i=0; i < keys.length; i++) {
758769
if (keys[i].indexOf('@') === 0) {
759770
p = parseParameter(param[keys[i]]);
760771
if (p) {
@@ -800,7 +811,7 @@ function extractGroupByPart(workingObject, quiet) {
800811
workingObject.group = {
801812
field : formatFieldName(m[1]),
802813
collapse : false
803-
}
814+
};
804815
}
805816
}
806817

@@ -974,8 +985,6 @@ function extractListAndFieldNameParts(workingObject) {
974985
}
975986

976987
workingObject.query = m[3];
977-
} else {
978-
workingObject.query = "";
979988
}
980989
}
981990
}
@@ -1037,8 +1046,9 @@ function extractOrderByPart(workingObject, quiet) {
10371046
}
10381047
dataType = m[0];
10391048
match[1] = m[1];
1040-
} else
1041-
return [];
1049+
}
1050+
} else if (!match[1].match(/^[a-z\d_]+$/i)) {
1051+
throw "[camlsql] Wrap order by field name in brackets if it contains special characters";
10421052
}
10431053
fieldName = formatFieldName(match[1]);
10441054
if (match.length == 3) {
@@ -1146,7 +1156,7 @@ function extractNamesToEncode(workingObject) {
11461156
counter--;
11471157
if (counter == 0) {
11481158
match = query.substring( startIndex, i+1 );
1149-
normalized = match.substring(1, match.length-1),
1159+
normalized = match.substring(1, match.length-1);
11501160
encoded = encodeToInternalField(normalized);
11511161
newQuery = newQuery.replace(match, encoded);
11521162
startIndex = null;
@@ -1392,11 +1402,7 @@ var WhereParser = function(whereString, quiet) {
13921402
if (prevMacro == null)
13931403
prevMacro = m[3][0];
13941404
else if (prevMacro != m[3][0]) {
1395-
1396-
console.log("prevMacro", prevMacro, comparison);
1397-
13981405
throw "[camlsql] You can not mix named macros and ?";
1399-
return null;
14001406
}
14011407
if (m[3][0] == "@") {
14021408
macro = m[3];
@@ -1455,7 +1461,7 @@ function CamlXmlBuilder(query, isExec) {
14551461
parsedQuery.uuid = function(prefix) {
14561462
n++;
14571463
return prefix + n;
1458-
}
1464+
};
14591465
// remember https://yieldreturnpost.wordpress.com/2012/10/26/caml-query-utc-date-comparisons-in-sharepoint/
14601466
// <Value Type='DateTime' IncludeTimeValue='TRUE' StorageTZ='TRUE'>
14611467
// 2012-10-24T21:30:46Z
@@ -1528,6 +1534,8 @@ function createProjectedFieldsElement(projectedFields, joins) {
15281534
}
15291535

15301536
xml += xmlEndElement("ProjectedFields");
1537+
} else if (projectedFields.length > 0 && joins.length == 0) {
1538+
throw "[camlsql] You must JOIN another list to use projected fields";
15311539
}
15321540

15331541
return xml;
@@ -1642,8 +1650,8 @@ function createStatementXml(parsedQuery, statement, parameters, log) {
16421650

16431651
if (param && param.type == "Membership") {
16441652
if (statement.comparison != "eq") throw "[camlsql] Membership comparison must be =";
1645-
if (param.value.toLowerCase() == "spgroup" && !param.id)
1646-
throw "[camlsql] Membership of type SPGroup requires a group id";
1653+
// if (param.value.toLowerCase() == "spgroup" && !param.id)
1654+
// throw "[camlsql] Membership of type SPGroup requires a group id";
16471655
xml += xmlBeginElement("Membership", {Type : param.value, ID : param.id ? param.id : null});
16481656
xml += xmlBeginElement(XML_FIELD_FIELDREF, {Name : statement.field}, true);
16491657
xml += xmlEndElement("Membership");
@@ -1665,15 +1673,9 @@ function createStatementXml(parsedQuery, statement, parameters, log) {
16651673
xml+=createFieldRefValue(parsedQuery, statement);
16661674
xml+=xmlEndElement(XML_ELEMENT_ISNOTNULL);
16671675
} else if (comparison == "like") {
1668-
if (typeof param === "undefined")
1669-
throw "[camlsql] Parameter is not defined " + statement.macro;
16701676
var x = getXmlElementForLikeStatement(param.value);
1671-
//console.log("statement", statement);
1672-
//console.log("parameters", parameters);
1673-
//console.warn("X", param);
16741677
elementName = x[1];
16751678
param.overrideValue = x[0];
1676-
16771679
xml+=xmlBeginElement(elementName);
16781680
xml+=createFieldRefValue(parsedQuery, statement, param);
16791681
xml+=xmlEndElement(elementName);
@@ -1760,15 +1762,15 @@ function createFieldRefValue(parsedQuery, statement, parameter, isWhereClause) {
17601762
if (!parameter || parameter.constructor !== Array)
17611763
throw "[camlsql] IN parameter must be an array";
17621764
xml += '<Values>';
1763-
for (var i=0; i < parameter.length; i++) {
1765+
for (i=0; i < parameter.length; i++) {
17641766
xml += creatValueElement(statement, parameter[i], parameter[i].value);
17651767
}
17661768
xml += '</Values>';
17671769
} else {
17681770
xml += creatValueElement(statement, parameter);
17691771
}
17701772
}
1771-
return xml;;
1773+
return xml;
17721774
}
17731775

17741776
function creatValueElement(statement, parameter) {
@@ -1790,8 +1792,8 @@ function createFieldRefValue(parsedQuery, statement, parameter, isWhereClause) {
17901792
}
17911793
if (parameter.today === true) {
17921794
innerXml = xmlBeginElement('Today', vAttr, true);
1793-
} else if (parameter.isNow === true) {
1794-
innerXml = "<Now />";
1795+
// } else if (parameter.isNow === true) {
1796+
// innerXml = "<Now />";
17951797
} else {
17961798
valueAttributes.StorageTZ = parameter._storageTZ ? 'True' : null;
17971799
if (parameter.stringValue) {
@@ -1830,7 +1832,7 @@ function createFieldRefValue(parsedQuery, statement, parameter, isWhereClause) {
18301832
innerXml = parameterValue ? 1 : 0;
18311833

18321834
} else {
1833-
innerXml = xmlBeginElement('NotImplemented',{}, true);
1835+
throw "[camlsql] Parameter type is not not implemented " + parameter.type;
18341836
}
18351837

18361838
xml += xmlBeginElement('Value', valueAttributes);

dist/camlsql.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/public_html/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ <h1>Get started Guide</h1>
114114

115115
<h2>1. Include the script</h2>
116116
<p>Include <code>camlsql</code> on your page. It has no dependencies for basic use.</p>
117-
<pre class="prettyprint"><code class="javascript">&lt;script src="https://rawgit.com/dlid/camlsql-js/0.5.1/dist/js/camlsql.min.js"&gt;&lt;script&gt;</code></pre>
117+
<pre class="prettyprint"><code class="javascript">&lt;script src="https://rawgit.com/dlid/camlsql-js/0.5.2/dist/js/camlsql.min.js"&gt;&lt;script&gt;</code></pre>
118118

119119
<h2>2. Prepare your query</h2>
120120
<p>Your camlsql query consists of two components: the SQL query and the parameters. This is argument one and two in the <code>prepare</code> method.</p>

0 commit comments

Comments
 (0)