Tobias Gritschacher has submitted this change and it was merged.
Change subject: (bug 48145) Introduction of TimeValue data value type in
JavaScript
......................................................................
(bug 48145) Introduction of TimeValue data value type in JavaScript
Changed the backend's TimeValue precision numbers to match the one from the
frontend since
the time.js's options and precision handling is quite a mess right now. For
having a simple
version of the time value frontend running asap, this is the faster way to get
there.
Change-Id: Id9db92258aa667cc625df1483b0dd5aaf8dd3c7b
---
M DataTypes/DataTypes.mw.php
M DataValues/DataValues.resources.php
M DataValues/DataValues.tests.qunit.php
M DataValues/includes/values/TimeValue.php
A DataValues/resources/values/TimeValue.js
A DataValues/tests/qunit/values/TimeValue.tests.js
6 files changed, 185 insertions(+), 17 deletions(-)
Approvals:
Tobias Gritschacher: Looks good to me, approved
jenkins-bot: Verified
diff --git a/DataTypes/DataTypes.mw.php b/DataTypes/DataTypes.mw.php
index 39d7c68..23622ac 100644
--- a/DataTypes/DataTypes.mw.php
+++ b/DataTypes/DataTypes.mw.php
@@ -124,7 +124,8 @@
),
'dependencies' => array(
'dataTypes',
- 'qunit.parameterize'
+ 'dataValues.values',
+ 'qunit.parameterize',
),
);
diff --git a/DataValues/DataValues.resources.php
b/DataValues/DataValues.resources.php
index 70eff85..da979e9 100644
--- a/DataValues/DataValues.resources.php
+++ b/DataValues/DataValues.resources.php
@@ -57,16 +57,20 @@
'dataValues.values' => $moduleTemplate + array(
'scripts' => array(
- // Note: the order here is relevant, scripts
should be places after the ones they depend on
+ // Note: The order here is relevant, scripts
should be places after the ones they
+ // depend on.
+ // TODO: Make one module per data value type.
'values/BoolValue.js',
'values/MonolingualTextValue.js',
'values/MultilingualTextValue.js',
'values/StringValue.js',
'values/NumberValue.js',
+ 'values/TimeValue.js',
'values/UnknownValue.js',
),
'dependencies' => array(
'dataValues.DataValue',
+ 'time.js' // required by TimeValue
),
),
diff --git a/DataValues/DataValues.tests.qunit.php
b/DataValues/DataValues.tests.qunit.php
index b3309b6..a2fa7d5 100644
--- a/DataValues/DataValues.tests.qunit.php
+++ b/DataValues/DataValues.tests.qunit.php
@@ -60,6 +60,7 @@
"$bp/values/MultilingualTextValue.tests.js",
"$bp/values/StringValue.tests.js",
"$bp/values/NumberValue.tests.js",
+ "$bp/values/TimeValue.tests.js",
"$bp/values/UnknownValue.tests.js",
),
'dependencies' => array(
diff --git a/DataValues/includes/values/TimeValue.php
b/DataValues/includes/values/TimeValue.php
index 5adbb08..3a0db4e 100644
--- a/DataValues/includes/values/TimeValue.php
+++ b/DataValues/includes/values/TimeValue.php
@@ -34,21 +34,21 @@
*/
class TimeValue extends DataValueObject {
- const PRECISION_Ga = 28; // Gigayear
- const PRECISION_100Ma = 29; // 100 Megayears
- const PRECISION_10Ma = 30; // 10 Megayears
- const PRECISION_Ma = 31; // Megayear
- const PRECISION_100ka = 32; // 100 Kiloyears
- const PRECISION_10ka = 33; // 10 Kiloyears
- const PRECISION_ka = 34; // Kiloyear
- const PRECISION_100a = 35; // 100 years
- const PRECISION_10a = 36; // 10 years
- const PRECISION_YEAR = 37;
- const PRECISION_MONTH = 38;
- const PRECISION_DAY = 39;
- const PRECISION_HOUR = 40;
- const PRECISION_MINUTE = 41;
- const PRECISION_SECOND = 42;
+ const PRECISION_Ga = 0; // Gigayear
+ const PRECISION_100Ma = 1; // 100 Megayears
+ const PRECISION_10Ma = 2; // 10 Megayears
+ const PRECISION_Ma = 3; // Megayear
+ const PRECISION_100ka = 4; // 100 Kiloyears
+ const PRECISION_10ka = 5; // 10 Kiloyears
+ const PRECISION_ka = 6; // Kiloyear
+ const PRECISION_100a = 7; // 100 years
+ const PRECISION_10a = 8; // 10 years
+ const PRECISION_YEAR = 9;
+ const PRECISION_MONTH = 10;
+ const PRECISION_DAY = 11;
+ const PRECISION_HOUR = 12;
+ const PRECISION_MINUTE = 13;
+ const PRECISION_SECOND = 14;
/**
* Point in time, represented per ISO8601.
diff --git a/DataValues/resources/values/TimeValue.js
b/DataValues/resources/values/TimeValue.js
new file mode 100644
index 0000000..3436ee5
--- /dev/null
+++ b/DataValues/resources/values/TimeValue.js
@@ -0,0 +1,115 @@
+/**
+ * @file
+ * @ingroup DataValues
+ *
+ * @licence GNU GPL v2+
+ *
+ * @author Daniel Werner < [email protected] >
+ */
+( function( dv, $, Time ) {
+ 'use strict';
+
+ var PARENT = dv.DataValue,
+ constructor = function( value ) {
+ if( !( value instanceof Time ) ) {
+ throw new Error( 'The given value has to be a
time.Time object' );
+ }
+ if( !value.isValid() ) {
+ throw new Error( 'The given time value has to
represent a valid time' );
+ }
+
+ this._value = value;
+ };
+
+ /**
+ * Constructor for creating a data value representing time.
+ *
+ * @constructor
+ * @extends dv.DataValue
+ * @since 0.1
+ *
+ * @param {String} value
+ */
+ var SELF = dv.TimeValue = dv.util.inherit( 'DvTimeValue', PARENT,
constructor, {
+ /**
+ * @see dv.DataValue.getSortKey
+ *
+ * @since 0.1
+ *
+ * @return String
+ */
+ getSortKey: function() {
+ return this.getValue().iso8601();
+ },
+
+ /**
+ * @see dv.DataValue.getValue
+ *
+ * @since 0.1
+ *
+ * @return time.Time
+ */
+ getValue: function() {
+ return this._value;
+ },
+
+ /**
+ * @see dv.DataValue.equals
+ *
+ * @since 0.1
+ */
+ equals: function( value ) {
+ if ( !( value instanceof SELF ) ) {
+ return false;
+ }
+
+ var ownTime = this.getValue(),
+ otherTime = value.getValue();
+
+ // no need to check for isValid() since constructor
won't allow invalid Time values
+
+ return ownTime.precision() === otherTime.precision()
+ && ownTime.iso8601() === otherTime.iso8601();
+ },
+
+ /**
+ * @see dv.DataValue.toJSON
+ *
+ * @since 0.1
+ */
+ toJSON: function() {
+ var time = this.getValue();
+
+ return {
+ time: time.iso8601(),
+ timezone: 0, // TODO timezone (offset in
minutes)
+ before: 0, // TODO
+ after: 0, // TODO
+ precision: time.precision(),
+ calendarmodel: time.calendarURI()
+ };
+ }
+
+ } );
+
+ /**
+ * @see dv.DataValue.newFromJSON
+ */
+ SELF.newFromJSON = function( json ) {
+ // TODO: not good to do it this way, there are some lost
information, e.g. the calendar
+ // model as well as before/after and UTC offset!
+ // Could simply fix this by creating a second Time object
where we use those infos as well
+ // as the first Time object's year(), month(), day() etc. The
Time constructor currently
+ // only takes a string for parsing though, which is very bad
as well.
+ var time = Time.newFromIso8601( json.time, json.precision );
+ return new SELF( time );
+ };
+
+ /**
+ * @see dv.DataValue.TYPE
+ */
+ SELF.TYPE = 'time';
+
+ dv.registerDataValue( SELF );
+
+}( dataValues, jQuery, time.Time ) );
diff --git a/DataValues/tests/qunit/values/TimeValue.tests.js
b/DataValues/tests/qunit/values/TimeValue.tests.js
new file mode 100644
index 0000000..b63b3c4
--- /dev/null
+++ b/DataValues/tests/qunit/values/TimeValue.tests.js
@@ -0,0 +1,47 @@
+/**
+ * @since 0.1
+ * @file
+ * @ingroup DataValues
+ *
+ * @licence GNU GPL v2+
+ * @author Daniel Werner < [email protected] >
+ */
+( function( dv, $, QUnit, Time ) {
+ 'use strict';
+
+ var PARENT = dv.tests.DataValueTest;
+
+ /**
+ * Constructor for creating a test object for the time DataValue.
+ *
+ * @constructor
+ * @extends dv.tests.DataValueTest
+ * @since 0.1
+ */
+ dv.tests.TimeValueTest = dv.util.inherit( PARENT, {
+
+ /**
+ * @see dv.tests.DataValueTest.getConstructor
+ */
+ getConstructor: function() {
+ return dv.TimeValue;
+ },
+
+ /**
+ * @see dv.tests.DataValueTest.getConstructorArguments
+ */
+ getConstructorArguments: function() {
+ return [
+ [ new Time( 'April 1, 1942' ) ],
+ [ new Time( '123456 BC' ) ],
+ [ new Time( '-42' ) ]
+ ];
+ }
+
+ } );
+
+ var test = new dv.tests.TimeValueTest();
+
+ test.runTests( 'dataValues.TimeValue' );
+
+}( dataValues, jQuery, QUnit, time.Time ) );
--
To view, visit https://gerrit.wikimedia.org/r/61527
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Id9db92258aa667cc625df1483b0dd5aaf8dd3c7b
Gerrit-PatchSet: 6
Gerrit-Project: mediawiki/extensions/DataValues
Gerrit-Branch: master
Gerrit-Owner: Daniel Werner <[email protected]>
Gerrit-Reviewer: Tobias Gritschacher <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits