summaryrefslogtreecommitdiffstats
path: root/core/src/OC/util.js
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2019-01-31 18:50:59 +0100
committerChristoph Wurst <christoph@winzerhof-wurst.at>2019-02-01 08:25:01 +0100
commit0d43ef06f5dbd05edfe61e9c78461e15312834ea (patch)
treee11ee21cdca73769064e4a19bc65a48711cecaaa /core/src/OC/util.js
parent9de02d326799285896e163cb7b6b1b47a1a5bbb9 (diff)
downloadnextcloud-server-0d43ef06f5dbd05edfe61e9c78461e15312834ea.tar.gz
nextcloud-server-0d43ef06f5dbd05edfe61e9c78461e15312834ea.zip
Add OC.Util to the server bundle
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'core/src/OC/util.js')
-rw-r--r--core/src/OC/util.js251
1 files changed, 251 insertions, 0 deletions
diff --git a/core/src/OC/util.js b/core/src/OC/util.js
new file mode 100644
index 00000000000..c139a57be07
--- /dev/null
+++ b/core/src/OC/util.js
@@ -0,0 +1,251 @@
+/* global t */
+
+/*
+ * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import $ from 'jquery'
+import moment from 'moment'
+
+import History from './util-history'
+import OC from './index'
+import humanFileSize from '../Util/human-file-size'
+
+/**
+ * Utility functions
+ * @namespace OC.Util
+ */
+export default {
+
+ History,
+
+ // TODO: remove original functions from global namespace
+ humanFileSize,
+
+ /**
+ * Returns a file size in bytes from a humanly readable string
+ * Makes 2kB to 2048.
+ * Inspired by computerFileSize in helper.php
+ * @param {string} string file size in human readable format
+ * @return {number} or null if string could not be parsed
+ *
+ *
+ */
+ computerFileSize: function (string) {
+ if (typeof string !== 'string') {
+ return null;
+ }
+
+ var s = string.toLowerCase().trim();
+ var bytes = null;
+
+ var bytesArray = {
+ 'b': 1,
+ 'k': 1024,
+ 'kb': 1024,
+ 'mb': 1024 * 1024,
+ 'm': 1024 * 1024,
+ 'gb': 1024 * 1024 * 1024,
+ 'g': 1024 * 1024 * 1024,
+ 'tb': 1024 * 1024 * 1024 * 1024,
+ 't': 1024 * 1024 * 1024 * 1024,
+ 'pb': 1024 * 1024 * 1024 * 1024 * 1024,
+ 'p': 1024 * 1024 * 1024 * 1024 * 1024
+ };
+
+ var matches = s.match(/^[\s+]?([0-9]*)(\.([0-9]+))?( +)?([kmgtp]?b?)$/i);
+ if (matches !== null) {
+ bytes = parseFloat(s);
+ if (!isFinite(bytes)) {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ if (matches[5]) {
+ bytes = bytes * bytesArray[matches[5]];
+ }
+
+ bytes = Math.round(bytes);
+ return bytes;
+ },
+
+ /**
+ * @param timestamp
+ * @param format
+ * @returns {string} timestamp formatted as requested
+ */
+ formatDate: function (timestamp, format) {
+ format = format || "LLL";
+ return moment(timestamp).format(format);
+ },
+
+ /**
+ * @param timestamp
+ * @returns {string} human readable difference from now
+ */
+ relativeModifiedDate: function (timestamp) {
+ var diff = moment().diff(moment(timestamp));
+ if (diff >= 0 && diff < 45000) {
+ return t('core', 'seconds ago');
+ }
+ return moment(timestamp).fromNow();
+ },
+
+ /**
+ * Returns whether this is IE
+ *
+ * @return {bool} true if this is IE, false otherwise
+ */
+ isIE: function () {
+ return $('html').hasClass('ie');
+ },
+
+ /**
+ * Returns the width of a generic browser scrollbar
+ *
+ * @return {int} width of scrollbar
+ */
+ getScrollBarWidth: function () {
+ if (this._scrollBarWidth) {
+ return this._scrollBarWidth;
+ }
+
+ var inner = document.createElement('p');
+ inner.style.width = "100%";
+ inner.style.height = "200px";
+
+ var outer = document.createElement('div');
+ outer.style.position = "absolute";
+ outer.style.top = "0px";
+ outer.style.left = "0px";
+ outer.style.visibility = "hidden";
+ outer.style.width = "200px";
+ outer.style.height = "150px";
+ outer.style.overflow = "hidden";
+ outer.appendChild(inner);
+
+ document.body.appendChild(outer);
+ var w1 = inner.offsetWidth;
+ outer.style.overflow = 'scroll';
+ var w2 = inner.offsetWidth;
+ if (w1 === w2) {
+ w2 = outer.clientWidth;
+ }
+
+ document.body.removeChild(outer);
+
+ this._scrollBarWidth = (w1 - w2);
+
+ return this._scrollBarWidth;
+ },
+
+ /**
+ * Remove the time component from a given date
+ *
+ * @param {Date} date date
+ * @return {Date} date with stripped time
+ */
+ stripTime: function (date) {
+ // FIXME: likely to break when crossing DST
+ // would be better to use a library like momentJS
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate());
+ },
+
+ _chunkify: function (t) {
+ // Adapted from http://my.opera.com/GreyWyvern/blog/show.dml/1671288
+ var tz = [], x = 0, y = -1, n = 0, code, c;
+
+ while (x < t.length) {
+ c = t.charAt(x);
+ // only include the dot in strings
+ var m = ((!n && c === '.') || (c >= '0' && c <= '9'));
+ if (m !== n) {
+ // next chunk
+ y++;
+ tz[y] = '';
+ n = m;
+ }
+ tz[y] += c;
+ x++;
+ }
+ return tz;
+ },
+
+ /**
+ * Compare two strings to provide a natural sort
+ * @param a first string to compare
+ * @param b second string to compare
+ * @return -1 if b comes before a, 1 if a comes before b
+ * or 0 if the strings are identical
+ */
+ naturalSortCompare: function (a, b) {
+ var x;
+ var aa = this._chunkify(a);
+ var bb = this._chunkify(b);
+
+ for (x = 0; aa[x] && bb[x]; x++) {
+ if (aa[x] !== bb[x]) {
+ var aNum = Number(aa[x]), bNum = Number(bb[x]);
+ // note: == is correct here
+ if (aNum == aa[x] && bNum == bb[x]) {
+ return aNum - bNum;
+ } else {
+ // Note: This locale setting isn't supported by all browsers but for the ones
+ // that do there will be more consistency between client-server sorting
+ return aa[x].localeCompare(bb[x], OC.getLanguage());
+ }
+ }
+ }
+ return aa.length - bb.length;
+ },
+
+ /**
+ * Calls the callback in a given interval until it returns true
+ * @param {function} callback
+ * @param {integer} interval in milliseconds
+ */
+ waitFor: function (callback, interval) {
+ var internalCallback = function () {
+ if (callback() !== true) {
+ setTimeout(internalCallback, interval);
+ }
+ };
+
+ internalCallback();
+ },
+
+ /**
+ * Checks if a cookie with the given name is present and is set to the provided value.
+ * @param {string} name name of the cookie
+ * @param {string} value value of the cookie
+ * @return {boolean} true if the cookie with the given name has the given value
+ */
+ isCookieSetToValue: function (name, value) {
+ var cookies = document.cookie.split(';');
+ for (var i = 0; i < cookies.length; i++) {
+ var cookie = cookies[i].split('=');
+ if (cookie[0].trim() === name && cookie[1].trim() === value) {
+ return true;
+ }
+ }
+ return false;
+ }
+}