Skip to main content

Jalali Calendar - Releases

← App details

Nextcloud 34

Jalali Calendar 0.5.0
Release Details
UpdatedAug. 3, 2026, 4:54 p.m.
Changelog

Added

  • A Shamsi date picker for date fields elsewhere in Nextcloud, Deck due dates above all. Those fields are <input type="datetime-local">, drawn by the browser itself: they always render a Gregorian calendar, and no locale or stylesheet can change that. The picker therefore adds its own trigger and a badge showing the Shamsi equivalent beside the field, rather than trying to restyle it.

The native input stays the source of truth. It is enhanced in place and never replaced — apps bind their models to that exact element, and a re-created input loses the binding on the next render, after which the field looks fine and quietly stops saving. Picked dates are written through HTMLInputElement's own value setter and announced with bubbling input and change events, because a plain input.value = … assignment updates no model. The existing time of day is preserved; only the date changes.

  • A personal setting to turn the picker off (Settings → Personal → Jalali Calendar), on by default. Turning it off stops the script being delivered at all rather than loading it and having it decline to run, so opting out of injected JavaScript on unrelated pages is a real opt-out.

  • npm run test:parity holds JalaliConverter.php and jalaali-js to the same answers across 55,152 days (1925–2075) on toJalali, toGregorian and the round trip. The two are independent implementations, and the picker writes dates that the PHP side reads back, so a single day of drift would misplace off-days with nothing to trace it by. It runs as its own CI job: it needs PHP, and unlike the unit suite it is timezone-independent.

Changed

  • The picker ships as a separate ~11 kB entry point rather than riding on the calendar bundle. That bundle is ~395 kB, which is not something to put on every page in an instance, so the new one reaches for neither Vue nor @nextcloud/vue.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIECjCCAvICAhO6MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwODAzMDczMTQ4WhcNMzYxMTA4MDczMTQ4WjAaMRgwFgYD
VQQDDA9qYWxhbGlfY2FsZW5kYXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQDDAQzeNEr0D4lGp5EaFezYko9f61CkkgggiL4UjH51Y/RvF8dXBdg14dhE
INV2Pjl50uP00GbjgE2VCcGjuypu871o2M6Qtq+m6+1/GhOcYPV0H6TlD1V8Z3x/
bKhFZLtfCdggrydiF0dUVoKBgEnBGeTbkPuyW9gfxoNeEsbpGlnEZ6wnstw9pyb+
VLRXy/5dUf5jpFhUU3/ex1qUtifvJUgoJCVy196qkRd7puSXBO9mMck7vsHE9kTt
B+b4QZ1Qq5fnmqlHnXbMqllNYge87jp//xg9p1WakGDqqhepIPPNqYbngC5pJVB6
Q5gRQgVeVWIRT55llAdw78QPFFBP47cfRTUa2fpx40+2XcPfBR3ln61Rc4wzX1o6
eXGbnKgTmZTJrwCA5CLHPkPAjQh1CNQUco9g3JsOyWkZ8KayjUJlR9jc5P3ASi9P
gvqHI7PrJepusqodh5fgifxYcXEu1sTfmT/it1lzk+OcKWLUenIgof4lsy5NmQLf
bX3p81Vp0qk6nrnG0Rg0XWentmH2Yo/6Lkd7efnnJ+1pVevbF7er2bXDowjKo1l3
QdesS2IkM/yg4fo08xQ8LzLYvrNTGkXJxj817roVY9lyyA/oZ+Ds5KTZ+NbuNSKE
S9Otv55y+t8ckNoiYjYQoFu15HmfRGuV2gLq0p3A/BuUqlV9WwIDAQABMA0GCSqG
SIb3DQEBCwUAA4IBAQCbnIv/DM3mcARkIBeZkmFSSoKF+eC+2DLD3k76fXkMyxO3
qowkK9V0toVrb2IBWuUcNfSednN7cMTF8AwMJioKliALRzSTz5lDViMziqO866lw
7d8jIRsySqSiTxLomRBjsjzF3Ky0x83364h5eSWWG5YawA2318zAQ2jvy/X5Legm
pQDH4BjtB1FVA2+T66u4EX7WOcoqmZzDPZAXc8e5pmjehFzi1Y08pvEadE1ny7Da
mrCr9crFcs+AOPyRidSC+4kti07ThWJ/DlXpojOc2mripPZm1OXSOVgQ9P74wv59
lWnvC1PxuifaARtAuUfItLFMDbxR2j9JPMW19bdG
-----END CERTIFICATE-----
SignatureE+D924P1r+KUCJPQVXtlMmfFVlSbmf3kNPcdNyXX9U1X6/9HZ7A+dSEUBvPFx1LH22e9tA6hIP+OY4Fuk/sJokxvu5CmNUu96eMnPlI2xIgyfbgY/GY8J3SPRe7uar2oyRpAGHfrmlzS/UZItVBFsRpmyk47TYzH0sRNH0LtOZgIh6O9UO6xgJpdelbVdYJ1RLbf7jo8iZJwYbXjfmf3tejengqyf6RpORx+0rxMMD9LuXldoLKKz3RBWzfp9ckyH2kIEjZbKBN+N6+ojZkAN/NO61DvhQbcsvJDr6hVoswZ212EEGJNmdrFtLSLSuzcvqh+fy238s2kGshWO/CQt9tqLhiyxoBlJiVwXj7uzK92S4xb6dXGaVtZyQEk5kiLOYCTcpzvOYuJp8R5UG2E4RRoRc4ywD0UH9DdvLw+GMwNLqfbW0HAkfXMF0cNA+H69tUUC3fzedyyHCaO+2OdxjmSYssb3y2+snT+daP88KJhKcqJ02Y+omispcN7sei0btml53Kay+/O1EfUnEFE2eWTq+aecuYMssd5UBI8IEm+fbgVvAj7tgTBDievRwnzodk0tZ2ZYTxAUm8B+Yqd7gluKAVze5MfU+PAS/RwM8tE1cB9uBZhfvDOVsQUmposDJTxgIPzwmu0tGeNT6+6ky69HU7VSLwpqUEQGkGRb/k=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.6.0

Nextcloud 33

Jalali Calendar 0.5.0
Release Details
UpdatedAug. 3, 2026, 4:54 p.m.
Changelog

Added

  • A Shamsi date picker for date fields elsewhere in Nextcloud, Deck due dates above all. Those fields are <input type="datetime-local">, drawn by the browser itself: they always render a Gregorian calendar, and no locale or stylesheet can change that. The picker therefore adds its own trigger and a badge showing the Shamsi equivalent beside the field, rather than trying to restyle it.

The native input stays the source of truth. It is enhanced in place and never replaced — apps bind their models to that exact element, and a re-created input loses the binding on the next render, after which the field looks fine and quietly stops saving. Picked dates are written through HTMLInputElement's own value setter and announced with bubbling input and change events, because a plain input.value = … assignment updates no model. The existing time of day is preserved; only the date changes.

  • A personal setting to turn the picker off (Settings → Personal → Jalali Calendar), on by default. Turning it off stops the script being delivered at all rather than loading it and having it decline to run, so opting out of injected JavaScript on unrelated pages is a real opt-out.

  • npm run test:parity holds JalaliConverter.php and jalaali-js to the same answers across 55,152 days (1925–2075) on toJalali, toGregorian and the round trip. The two are independent implementations, and the picker writes dates that the PHP side reads back, so a single day of drift would misplace off-days with nothing to trace it by. It runs as its own CI job: it needs PHP, and unlike the unit suite it is timezone-independent.

Changed

  • The picker ships as a separate ~11 kB entry point rather than riding on the calendar bundle. That bundle is ~395 kB, which is not something to put on every page in an instance, so the new one reaches for neither Vue nor @nextcloud/vue.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIECjCCAvICAhO6MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwODAzMDczMTQ4WhcNMzYxMTA4MDczMTQ4WjAaMRgwFgYD
VQQDDA9qYWxhbGlfY2FsZW5kYXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQDDAQzeNEr0D4lGp5EaFezYko9f61CkkgggiL4UjH51Y/RvF8dXBdg14dhE
INV2Pjl50uP00GbjgE2VCcGjuypu871o2M6Qtq+m6+1/GhOcYPV0H6TlD1V8Z3x/
bKhFZLtfCdggrydiF0dUVoKBgEnBGeTbkPuyW9gfxoNeEsbpGlnEZ6wnstw9pyb+
VLRXy/5dUf5jpFhUU3/ex1qUtifvJUgoJCVy196qkRd7puSXBO9mMck7vsHE9kTt
B+b4QZ1Qq5fnmqlHnXbMqllNYge87jp//xg9p1WakGDqqhepIPPNqYbngC5pJVB6
Q5gRQgVeVWIRT55llAdw78QPFFBP47cfRTUa2fpx40+2XcPfBR3ln61Rc4wzX1o6
eXGbnKgTmZTJrwCA5CLHPkPAjQh1CNQUco9g3JsOyWkZ8KayjUJlR9jc5P3ASi9P
gvqHI7PrJepusqodh5fgifxYcXEu1sTfmT/it1lzk+OcKWLUenIgof4lsy5NmQLf
bX3p81Vp0qk6nrnG0Rg0XWentmH2Yo/6Lkd7efnnJ+1pVevbF7er2bXDowjKo1l3
QdesS2IkM/yg4fo08xQ8LzLYvrNTGkXJxj817roVY9lyyA/oZ+Ds5KTZ+NbuNSKE
S9Otv55y+t8ckNoiYjYQoFu15HmfRGuV2gLq0p3A/BuUqlV9WwIDAQABMA0GCSqG
SIb3DQEBCwUAA4IBAQCbnIv/DM3mcARkIBeZkmFSSoKF+eC+2DLD3k76fXkMyxO3
qowkK9V0toVrb2IBWuUcNfSednN7cMTF8AwMJioKliALRzSTz5lDViMziqO866lw
7d8jIRsySqSiTxLomRBjsjzF3Ky0x83364h5eSWWG5YawA2318zAQ2jvy/X5Legm
pQDH4BjtB1FVA2+T66u4EX7WOcoqmZzDPZAXc8e5pmjehFzi1Y08pvEadE1ny7Da
mrCr9crFcs+AOPyRidSC+4kti07ThWJ/DlXpojOc2mripPZm1OXSOVgQ9P74wv59
lWnvC1PxuifaARtAuUfItLFMDbxR2j9JPMW19bdG
-----END CERTIFICATE-----
SignatureE+D924P1r+KUCJPQVXtlMmfFVlSbmf3kNPcdNyXX9U1X6/9HZ7A+dSEUBvPFx1LH22e9tA6hIP+OY4Fuk/sJokxvu5CmNUu96eMnPlI2xIgyfbgY/GY8J3SPRe7uar2oyRpAGHfrmlzS/UZItVBFsRpmyk47TYzH0sRNH0LtOZgIh6O9UO6xgJpdelbVdYJ1RLbf7jo8iZJwYbXjfmf3tejengqyf6RpORx+0rxMMD9LuXldoLKKz3RBWzfp9ckyH2kIEjZbKBN+N6+ojZkAN/NO61DvhQbcsvJDr6hVoswZ212EEGJNmdrFtLSLSuzcvqh+fy238s2kGshWO/CQt9tqLhiyxoBlJiVwXj7uzK92S4xb6dXGaVtZyQEk5kiLOYCTcpzvOYuJp8R5UG2E4RRoRc4ywD0UH9DdvLw+GMwNLqfbW0HAkfXMF0cNA+H69tUUC3fzedyyHCaO+2OdxjmSYssb3y2+snT+daP88KJhKcqJ02Y+omispcN7sei0btml53Kay+/O1EfUnEFE2eWTq+aecuYMssd5UBI8IEm+fbgVvAj7tgTBDievRwnzodk0tZ2ZYTxAUm8B+Yqd7gluKAVze5MfU+PAS/RwM8tE1cB9uBZhfvDOVsQUmposDJTxgIPzwmu0tGeNT6+6ky69HU7VSLwpqUEQGkGRb/k=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.6.0

Nextcloud 32

Jalali Calendar 0.5.0
Release Details
UpdatedAug. 3, 2026, 4:54 p.m.
Changelog

Added

  • A Shamsi date picker for date fields elsewhere in Nextcloud, Deck due dates above all. Those fields are <input type="datetime-local">, drawn by the browser itself: they always render a Gregorian calendar, and no locale or stylesheet can change that. The picker therefore adds its own trigger and a badge showing the Shamsi equivalent beside the field, rather than trying to restyle it.

The native input stays the source of truth. It is enhanced in place and never replaced — apps bind their models to that exact element, and a re-created input loses the binding on the next render, after which the field looks fine and quietly stops saving. Picked dates are written through HTMLInputElement's own value setter and announced with bubbling input and change events, because a plain input.value = … assignment updates no model. The existing time of day is preserved; only the date changes.

  • A personal setting to turn the picker off (Settings → Personal → Jalali Calendar), on by default. Turning it off stops the script being delivered at all rather than loading it and having it decline to run, so opting out of injected JavaScript on unrelated pages is a real opt-out.

  • npm run test:parity holds JalaliConverter.php and jalaali-js to the same answers across 55,152 days (1925–2075) on toJalali, toGregorian and the round trip. The two are independent implementations, and the picker writes dates that the PHP side reads back, so a single day of drift would misplace off-days with nothing to trace it by. It runs as its own CI job: it needs PHP, and unlike the unit suite it is timezone-independent.

Changed

  • The picker ships as a separate ~11 kB entry point rather than riding on the calendar bundle. That bundle is ~395 kB, which is not something to put on every page in an instance, so the new one reaches for neither Vue nor @nextcloud/vue.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIECjCCAvICAhO6MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwODAzMDczMTQ4WhcNMzYxMTA4MDczMTQ4WjAaMRgwFgYD
VQQDDA9qYWxhbGlfY2FsZW5kYXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQDDAQzeNEr0D4lGp5EaFezYko9f61CkkgggiL4UjH51Y/RvF8dXBdg14dhE
INV2Pjl50uP00GbjgE2VCcGjuypu871o2M6Qtq+m6+1/GhOcYPV0H6TlD1V8Z3x/
bKhFZLtfCdggrydiF0dUVoKBgEnBGeTbkPuyW9gfxoNeEsbpGlnEZ6wnstw9pyb+
VLRXy/5dUf5jpFhUU3/ex1qUtifvJUgoJCVy196qkRd7puSXBO9mMck7vsHE9kTt
B+b4QZ1Qq5fnmqlHnXbMqllNYge87jp//xg9p1WakGDqqhepIPPNqYbngC5pJVB6
Q5gRQgVeVWIRT55llAdw78QPFFBP47cfRTUa2fpx40+2XcPfBR3ln61Rc4wzX1o6
eXGbnKgTmZTJrwCA5CLHPkPAjQh1CNQUco9g3JsOyWkZ8KayjUJlR9jc5P3ASi9P
gvqHI7PrJepusqodh5fgifxYcXEu1sTfmT/it1lzk+OcKWLUenIgof4lsy5NmQLf
bX3p81Vp0qk6nrnG0Rg0XWentmH2Yo/6Lkd7efnnJ+1pVevbF7er2bXDowjKo1l3
QdesS2IkM/yg4fo08xQ8LzLYvrNTGkXJxj817roVY9lyyA/oZ+Ds5KTZ+NbuNSKE
S9Otv55y+t8ckNoiYjYQoFu15HmfRGuV2gLq0p3A/BuUqlV9WwIDAQABMA0GCSqG
SIb3DQEBCwUAA4IBAQCbnIv/DM3mcARkIBeZkmFSSoKF+eC+2DLD3k76fXkMyxO3
qowkK9V0toVrb2IBWuUcNfSednN7cMTF8AwMJioKliALRzSTz5lDViMziqO866lw
7d8jIRsySqSiTxLomRBjsjzF3Ky0x83364h5eSWWG5YawA2318zAQ2jvy/X5Legm
pQDH4BjtB1FVA2+T66u4EX7WOcoqmZzDPZAXc8e5pmjehFzi1Y08pvEadE1ny7Da
mrCr9crFcs+AOPyRidSC+4kti07ThWJ/DlXpojOc2mripPZm1OXSOVgQ9P74wv59
lWnvC1PxuifaARtAuUfItLFMDbxR2j9JPMW19bdG
-----END CERTIFICATE-----
SignatureE+D924P1r+KUCJPQVXtlMmfFVlSbmf3kNPcdNyXX9U1X6/9HZ7A+dSEUBvPFx1LH22e9tA6hIP+OY4Fuk/sJokxvu5CmNUu96eMnPlI2xIgyfbgY/GY8J3SPRe7uar2oyRpAGHfrmlzS/UZItVBFsRpmyk47TYzH0sRNH0LtOZgIh6O9UO6xgJpdelbVdYJ1RLbf7jo8iZJwYbXjfmf3tejengqyf6RpORx+0rxMMD9LuXldoLKKz3RBWzfp9ckyH2kIEjZbKBN+N6+ojZkAN/NO61DvhQbcsvJDr6hVoswZ212EEGJNmdrFtLSLSuzcvqh+fy238s2kGshWO/CQt9tqLhiyxoBlJiVwXj7uzK92S4xb6dXGaVtZyQEk5kiLOYCTcpzvOYuJp8R5UG2E4RRoRc4ywD0UH9DdvLw+GMwNLqfbW0HAkfXMF0cNA+H69tUUC3fzedyyHCaO+2OdxjmSYssb3y2+snT+daP88KJhKcqJ02Y+omispcN7sei0btml53Kay+/O1EfUnEFE2eWTq+aecuYMssd5UBI8IEm+fbgVvAj7tgTBDievRwnzodk0tZ2ZYTxAUm8B+Yqd7gluKAVze5MfU+PAS/RwM8tE1cB9uBZhfvDOVsQUmposDJTxgIPzwmu0tGeNT6+6ky69HU7VSLwpqUEQGkGRb/k=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.6.0

Nextcloud 31

Jalali Calendar 0.5.0
Release Details
UpdatedAug. 3, 2026, 4:54 p.m.
Changelog

Added

  • A Shamsi date picker for date fields elsewhere in Nextcloud, Deck due dates above all. Those fields are <input type="datetime-local">, drawn by the browser itself: they always render a Gregorian calendar, and no locale or stylesheet can change that. The picker therefore adds its own trigger and a badge showing the Shamsi equivalent beside the field, rather than trying to restyle it.

The native input stays the source of truth. It is enhanced in place and never replaced — apps bind their models to that exact element, and a re-created input loses the binding on the next render, after which the field looks fine and quietly stops saving. Picked dates are written through HTMLInputElement's own value setter and announced with bubbling input and change events, because a plain input.value = … assignment updates no model. The existing time of day is preserved; only the date changes.

  • A personal setting to turn the picker off (Settings → Personal → Jalali Calendar), on by default. Turning it off stops the script being delivered at all rather than loading it and having it decline to run, so opting out of injected JavaScript on unrelated pages is a real opt-out.

  • npm run test:parity holds JalaliConverter.php and jalaali-js to the same answers across 55,152 days (1925–2075) on toJalali, toGregorian and the round trip. The two are independent implementations, and the picker writes dates that the PHP side reads back, so a single day of drift would misplace off-days with nothing to trace it by. It runs as its own CI job: it needs PHP, and unlike the unit suite it is timezone-independent.

Changed

  • The picker ships as a separate ~11 kB entry point rather than riding on the calendar bundle. That bundle is ~395 kB, which is not something to put on every page in an instance, so the new one reaches for neither Vue nor @nextcloud/vue.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIECjCCAvICAhO6MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwODAzMDczMTQ4WhcNMzYxMTA4MDczMTQ4WjAaMRgwFgYD
VQQDDA9qYWxhbGlfY2FsZW5kYXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQDDAQzeNEr0D4lGp5EaFezYko9f61CkkgggiL4UjH51Y/RvF8dXBdg14dhE
INV2Pjl50uP00GbjgE2VCcGjuypu871o2M6Qtq+m6+1/GhOcYPV0H6TlD1V8Z3x/
bKhFZLtfCdggrydiF0dUVoKBgEnBGeTbkPuyW9gfxoNeEsbpGlnEZ6wnstw9pyb+
VLRXy/5dUf5jpFhUU3/ex1qUtifvJUgoJCVy196qkRd7puSXBO9mMck7vsHE9kTt
B+b4QZ1Qq5fnmqlHnXbMqllNYge87jp//xg9p1WakGDqqhepIPPNqYbngC5pJVB6
Q5gRQgVeVWIRT55llAdw78QPFFBP47cfRTUa2fpx40+2XcPfBR3ln61Rc4wzX1o6
eXGbnKgTmZTJrwCA5CLHPkPAjQh1CNQUco9g3JsOyWkZ8KayjUJlR9jc5P3ASi9P
gvqHI7PrJepusqodh5fgifxYcXEu1sTfmT/it1lzk+OcKWLUenIgof4lsy5NmQLf
bX3p81Vp0qk6nrnG0Rg0XWentmH2Yo/6Lkd7efnnJ+1pVevbF7er2bXDowjKo1l3
QdesS2IkM/yg4fo08xQ8LzLYvrNTGkXJxj817roVY9lyyA/oZ+Ds5KTZ+NbuNSKE
S9Otv55y+t8ckNoiYjYQoFu15HmfRGuV2gLq0p3A/BuUqlV9WwIDAQABMA0GCSqG
SIb3DQEBCwUAA4IBAQCbnIv/DM3mcARkIBeZkmFSSoKF+eC+2DLD3k76fXkMyxO3
qowkK9V0toVrb2IBWuUcNfSednN7cMTF8AwMJioKliALRzSTz5lDViMziqO866lw
7d8jIRsySqSiTxLomRBjsjzF3Ky0x83364h5eSWWG5YawA2318zAQ2jvy/X5Legm
pQDH4BjtB1FVA2+T66u4EX7WOcoqmZzDPZAXc8e5pmjehFzi1Y08pvEadE1ny7Da
mrCr9crFcs+AOPyRidSC+4kti07ThWJ/DlXpojOc2mripPZm1OXSOVgQ9P74wv59
lWnvC1PxuifaARtAuUfItLFMDbxR2j9JPMW19bdG
-----END CERTIFICATE-----
SignatureE+D924P1r+KUCJPQVXtlMmfFVlSbmf3kNPcdNyXX9U1X6/9HZ7A+dSEUBvPFx1LH22e9tA6hIP+OY4Fuk/sJokxvu5CmNUu96eMnPlI2xIgyfbgY/GY8J3SPRe7uar2oyRpAGHfrmlzS/UZItVBFsRpmyk47TYzH0sRNH0LtOZgIh6O9UO6xgJpdelbVdYJ1RLbf7jo8iZJwYbXjfmf3tejengqyf6RpORx+0rxMMD9LuXldoLKKz3RBWzfp9ckyH2kIEjZbKBN+N6+ojZkAN/NO61DvhQbcsvJDr6hVoswZ212EEGJNmdrFtLSLSuzcvqh+fy238s2kGshWO/CQt9tqLhiyxoBlJiVwXj7uzK92S4xb6dXGaVtZyQEk5kiLOYCTcpzvOYuJp8R5UG2E4RRoRc4ywD0UH9DdvLw+GMwNLqfbW0HAkfXMF0cNA+H69tUUC3fzedyyHCaO+2OdxjmSYssb3y2+snT+daP88KJhKcqJ02Y+omispcN7sei0btml53Kay+/O1EfUnEFE2eWTq+aecuYMssd5UBI8IEm+fbgVvAj7tgTBDievRwnzodk0tZ2ZYTxAUm8B+Yqd7gluKAVze5MfU+PAS/RwM8tE1cB9uBZhfvDOVsQUmposDJTxgIPzwmu0tGeNT6+6ky69HU7VSLwpqUEQGkGRb/k=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.6.0

Nextcloud 30

Jalali Calendar 0.5.0
Release Details
UpdatedAug. 3, 2026, 4:54 p.m.
Changelog

Added

  • A Shamsi date picker for date fields elsewhere in Nextcloud, Deck due dates above all. Those fields are <input type="datetime-local">, drawn by the browser itself: they always render a Gregorian calendar, and no locale or stylesheet can change that. The picker therefore adds its own trigger and a badge showing the Shamsi equivalent beside the field, rather than trying to restyle it.

The native input stays the source of truth. It is enhanced in place and never replaced — apps bind their models to that exact element, and a re-created input loses the binding on the next render, after which the field looks fine and quietly stops saving. Picked dates are written through HTMLInputElement's own value setter and announced with bubbling input and change events, because a plain input.value = … assignment updates no model. The existing time of day is preserved; only the date changes.

  • A personal setting to turn the picker off (Settings → Personal → Jalali Calendar), on by default. Turning it off stops the script being delivered at all rather than loading it and having it decline to run, so opting out of injected JavaScript on unrelated pages is a real opt-out.

  • npm run test:parity holds JalaliConverter.php and jalaali-js to the same answers across 55,152 days (1925–2075) on toJalali, toGregorian and the round trip. The two are independent implementations, and the picker writes dates that the PHP side reads back, so a single day of drift would misplace off-days with nothing to trace it by. It runs as its own CI job: it needs PHP, and unlike the unit suite it is timezone-independent.

Changed

  • The picker ships as a separate ~11 kB entry point rather than riding on the calendar bundle. That bundle is ~395 kB, which is not something to put on every page in an instance, so the new one reaches for neither Vue nor @nextcloud/vue.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIECjCCAvICAhO6MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwODAzMDczMTQ4WhcNMzYxMTA4MDczMTQ4WjAaMRgwFgYD
VQQDDA9qYWxhbGlfY2FsZW5kYXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQDDAQzeNEr0D4lGp5EaFezYko9f61CkkgggiL4UjH51Y/RvF8dXBdg14dhE
INV2Pjl50uP00GbjgE2VCcGjuypu871o2M6Qtq+m6+1/GhOcYPV0H6TlD1V8Z3x/
bKhFZLtfCdggrydiF0dUVoKBgEnBGeTbkPuyW9gfxoNeEsbpGlnEZ6wnstw9pyb+
VLRXy/5dUf5jpFhUU3/ex1qUtifvJUgoJCVy196qkRd7puSXBO9mMck7vsHE9kTt
B+b4QZ1Qq5fnmqlHnXbMqllNYge87jp//xg9p1WakGDqqhepIPPNqYbngC5pJVB6
Q5gRQgVeVWIRT55llAdw78QPFFBP47cfRTUa2fpx40+2XcPfBR3ln61Rc4wzX1o6
eXGbnKgTmZTJrwCA5CLHPkPAjQh1CNQUco9g3JsOyWkZ8KayjUJlR9jc5P3ASi9P
gvqHI7PrJepusqodh5fgifxYcXEu1sTfmT/it1lzk+OcKWLUenIgof4lsy5NmQLf
bX3p81Vp0qk6nrnG0Rg0XWentmH2Yo/6Lkd7efnnJ+1pVevbF7er2bXDowjKo1l3
QdesS2IkM/yg4fo08xQ8LzLYvrNTGkXJxj817roVY9lyyA/oZ+Ds5KTZ+NbuNSKE
S9Otv55y+t8ckNoiYjYQoFu15HmfRGuV2gLq0p3A/BuUqlV9WwIDAQABMA0GCSqG
SIb3DQEBCwUAA4IBAQCbnIv/DM3mcARkIBeZkmFSSoKF+eC+2DLD3k76fXkMyxO3
qowkK9V0toVrb2IBWuUcNfSednN7cMTF8AwMJioKliALRzSTz5lDViMziqO866lw
7d8jIRsySqSiTxLomRBjsjzF3Ky0x83364h5eSWWG5YawA2318zAQ2jvy/X5Legm
pQDH4BjtB1FVA2+T66u4EX7WOcoqmZzDPZAXc8e5pmjehFzi1Y08pvEadE1ny7Da
mrCr9crFcs+AOPyRidSC+4kti07ThWJ/DlXpojOc2mripPZm1OXSOVgQ9P74wv59
lWnvC1PxuifaARtAuUfItLFMDbxR2j9JPMW19bdG
-----END CERTIFICATE-----
SignatureE+D924P1r+KUCJPQVXtlMmfFVlSbmf3kNPcdNyXX9U1X6/9HZ7A+dSEUBvPFx1LH22e9tA6hIP+OY4Fuk/sJokxvu5CmNUu96eMnPlI2xIgyfbgY/GY8J3SPRe7uar2oyRpAGHfrmlzS/UZItVBFsRpmyk47TYzH0sRNH0LtOZgIh6O9UO6xgJpdelbVdYJ1RLbf7jo8iZJwYbXjfmf3tejengqyf6RpORx+0rxMMD9LuXldoLKKz3RBWzfp9ckyH2kIEjZbKBN+N6+ojZkAN/NO61DvhQbcsvJDr6hVoswZ212EEGJNmdrFtLSLSuzcvqh+fy238s2kGshWO/CQt9tqLhiyxoBlJiVwXj7uzK92S4xb6dXGaVtZyQEk5kiLOYCTcpzvOYuJp8R5UG2E4RRoRc4ywD0UH9DdvLw+GMwNLqfbW0HAkfXMF0cNA+H69tUUC3fzedyyHCaO+2OdxjmSYssb3y2+snT+daP88KJhKcqJ02Y+omispcN7sei0btml53Kay+/O1EfUnEFE2eWTq+aecuYMssd5UBI8IEm+fbgVvAj7tgTBDievRwnzodk0tZ2ZYTxAUm8B+Yqd7gluKAVze5MfU+PAS/RwM8tE1cB9uBZhfvDOVsQUmposDJTxgIPzwmu0tGeNT6+6ky69HU7VSLwpqUEQGkGRb/k=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.6.0