Skip to content
Open
Show file tree
Hide file tree
Changes from 43 commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
4066b29
20191004 NUS Templates batch 5
ccewuz Oct 4, 2019
31e4ee5
20191021 NUS Templates batch 6 + some slight changes to existing temp…
ccewuz Oct 21, 2019
9e7cc0b
Merge branch 'master' into nus-templates-new
ccewuz Oct 21, 2019
370d972
20191111 update to legend and layout of some degree scrolls
ccewuz Nov 11, 2019
02d2576
Merge branch 'nus-templates-new' of https://github.com/ccewuz/legacy-…
ccewuz Nov 11, 2019
48c1c97
20191127 update to legend pages and some other slight changes
ccewuz Nov 27, 2019
b03ba80
20191127 update to legend pages and some other slight changes
ccewuz Nov 27, 2019
e0f3001
Merge branch 'nus-templates-new' of https://github.com/ccewuz/legacy-…
ccewuz Nov 27, 2019
cd2e662
20191127 update to legend pages and some other slight changes
ccewuz Nov 27, 2019
82caeb7
20191204 add new cert store into configure.js
ccewuz Dec 4, 2019
b9101c2
20191204 add new NUS cert store into rendering templates
ccewuz Dec 4, 2019
01f0938
20191204 slight change to transcript.js
ccewuz Dec 4, 2019
642da50
20191206 slight change to transcript.js
ccewuz Dec 6, 2019
2441f6e
20191210 add watermark
ccewuz Dec 10, 2019
5883d39
20191213 add disciplinary remarks into transcript
ccewuz Dec 13, 2019
42a88df
20191217 adjust position of watermark in transcript
ccewuz Dec 17, 2019
e86f1a1
Merge branch 'master' into nus-templates-new
ccewuz Dec 17, 2019
5a429c3
20191224 NUS Templates batch 7
ccewuz Dec 24, 2019
b1480f1
Merge branch 'nus-templates-new' of https://github.com/ccewuz/legacy-…
ccewuz Dec 24, 2019
698c32c
20200129 update to transcript with additional remarks and new legend
ccewuz Jan 29, 2020
a88bc7b
Merge branch 'master' into nus-templates-new
ccewuz Jan 29, 2020
d969830
20200227 add dismissal remarks into transcript
ccewuz Feb 27, 2020
bb8bbea
Merge branch 'nus-templates-new' of https://github.com/ccewuz/legacy-…
ccewuz Feb 27, 2020
bf473af
20200429 update for NGRD
ccewuz Apr 29, 2020
adfeb1d
Merge branch 'master' into nus-templates-new
ccewuz Apr 29, 2020
6565091
20200429 update for NGRD
ccewuz Apr 29, 2020
85618f2
20200429 update for NGRD
ccewuz Apr 29, 2020
bc96763
20200522 add logic for YNC NG transcript
ccewuz May 22, 2020
3527b3f
20200523 add logic for YNC NG transcript
ccewuz May 23, 2020
befc77b
20200527 fix to printing issues
ccewuz May 27, 2020
e273825
20200703 update legend pages
ccewuz Jul 3, 2020
0b3241a
20200706 update K1 to acccommodate a new type of diploma
ccewuz Jul 6, 2020
212af36
20200709 update DUKENUS templates to support mixed case name + bug fi…
ccewuz Jul 9, 2020
4952864
20200930 change display of CAP in certain conditions
ccewuz Sep 30, 2020
ba62b9d
20201109 update to ANU transcript
ccewuz Nov 9, 2020
472e999
20201109 update to NUS-ANU transcript
ccewuz Nov 9, 2020
93fab21
20210406 fix to DUKEPHD templates
ccewuz Apr 6, 2021
d0bad36
20210804 revamped transcripts
ccewuz Aug 4, 2021
42d1a6f
Merge branch 'master' into nus-templates-new
ccewuz Aug 4, 2021
046e9bf
20220114 change to transcript and new music template
ccewuz Jan 14, 2022
b59b6cf
Merge branch 'nus-templates-new' of https://github.com/ccewuz/legacy-…
ccewuz Jan 14, 2022
81beeb6
20220114 dismissal display cutoff date
ccewuz Jan 14, 2022
4aeb1db
Merge branch 'master' into nus-templates-new
ccewuz Jan 14, 2022
a57d424
Update transcript.js
ccewuz Jan 14, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/* eslint-disable class-methods-use-this */
import React from "react";
import PropTypes from "prop-types";
import {
DegreeScrollDataFeeder,
Degree
} from "../common/degreeScrollFramework";

// check whether use old wording
const useOldWording2022 = dataSource =>
dataSource.additionalData.programData &&
dataSource.additionalData.programData.some(
prog =>
prog.programCode &&
prog.programCode.startsWith("B09") &&
prog.admitTerm &&
prog.admitTerm < "1810"
);
// check whether it is diploma
const isDiploma = degreeCode => degreeCode.startsWith("G");

// data feeder
const getDataFeeder = dataSource => {
// data feeder
const dataFeeder = new DegreeScrollDataFeeder();
// logo is default
dataFeeder.studentName = dataSource.recipient.name.toUpperCase();
// Use old wording for bachelor degree with admit term earlier than 1810.
// Otherwise, use new wording (incl. master degree and grad diploma)
dataFeeder.postNameText = !useOldWording2022(dataSource)
? "having fulfilled the requirements prescribed\n" +
"by the Yong Siew Toh Conservatory of Music,\n" +
"National University of Singapore,\n" +
`${
isDiploma(dataSource.additionalData.degreeScroll[0].degreeCode)
? "was awarded the"
: "was conferred the degree of"
}`
: "having fulfilled the requirements prescribed\n" +
"by the Yong Siew Toh Conservatory of Music, National\n" +
"University of Singapore, in collaboration with the\n" +
"Peabody Conservatory of Music of The Johns\n" +
"Hopkins University, was conferred the degree of";
dataFeeder.degreeCode = dataSource.additionalData.degreeScroll[0].degreeCode;
dataFeeder.degreeTitle =
dataSource.additionalData.degreeScroll[0].degreeTitle;
dataFeeder.honours = dataSource.additionalData.degreeScroll[0].honours;
dataFeeder.major = dataSource.additionalData.degreeScroll[0].major;
dataFeeder.conferDate =
dataSource.additionalData.degreeScroll[0].dateConferred;
dataFeeder.spaceBeforeSig = "2.5cm";
if (dataSource.additionalData.images) {
dataFeeder.useDefaultSignature(
dataSource.additionalData.images.TRUSTEES,
dataSource.additionalData.images.PRESIDENT
);
}
return dataFeeder;
};

const Template = ({ certificate }) => {
// JSON data source
const jsonData = certificate;

// data feeder
const dataFeeder = getDataFeeder(jsonData);

// 794px is width of A4 portrait (21cm)
const ratio = (window.innerWidth - 30) / 794;
const scale =
ratio < 1
? {
transform: `scale(${ratio}, ${ratio})`,
transformOrigin: "top left"
}
: null;
const html = (
<div style={scale}>
<Degree dataFeeder={dataFeeder} />
</div>
);
return html;
};
export default Template;
Template.propTypes = {
certificate: PropTypes.object.isRequired
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import PropTypes from "prop-types";
import MultiCertificateRenderer from "template-utils/MultiCertificateRenderer";
import { storeAddresses } from "../common";
import Degree from "./degree";
import Transcript from "../NUSTS-GENERAL-2019/transcript";

const templates = [
{
id: "degree",
label: "Certificate",
template: Degree
},
{
id: "transcript",
label: "Transcript",
template: Transcript
}
];

const Cert = props => (
<MultiCertificateRenderer
templates={templates}
whitelist={storeAddresses}
{...props}
/>
);

Cert.propTypes = {
certificate: PropTypes.object.isRequired
};

export default Cert;
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
import { Selector } from "testcafe";
import { readFileSync } from "fs";
import { join } from "path";
import { getData } from "@govtechsg/open-attestation";

fixture("National University of Singapore").page`http://localhost:3000`;

const Certificate = "./sample.opencert";

const RenderedCertificate = Selector("#rendered-certificate");

const validateTextContent = async (t, component, texts) =>
texts.reduce(
async (prev, curr) => t.expect(component.textContent).contains(curr),
Promise.resolve()
);

test("NUS-MUSIC-2022 certificate is rendered correctly", async t => {
// Inject javascript and execute window.opencerts.renderDocument
const certificateContent = getData(
JSON.parse(readFileSync(join(__dirname, Certificate)).toString())
);
await t.eval(() => window.opencerts.renderDocument(certificateContent), {
dependencies: { certificateContent }
});

// Check content of window.opencerts.templates
const container = Selector("#rendered-certificate .container");
await container(); // wait for document to be rendered
const templates = await t.eval(() => window.opencerts.getTemplates());
await t
.expect(templates)
.eql([
{ id: "degree", label: "Certificate", template: undefined },
{ id: "transcript", label: "Transcript", template: undefined }
]);

await validateTextContent(t, RenderedCertificate, [
"NATIONAL",
"UNIVERSITY",
"OF SINGAPORE",
"A0117560L, NAME",
"Bachelor",
"Music",
"31 January 2018"
]);
await t.eval(() => window.opencerts.selectTemplateTab(1));
await validateTextContent(t, RenderedCertificate, [
"A0117560L, name",
"A0117560L",
"01/01/1905",
"11/09/2019",
"BACHELOR OF MUSIC",
"COMPLETED PROGRAMME",
"2013/2014 SEMESTER 2",
"MUA1154",
"Noon Recital Series 1B",
"MUA1162",
"Major Study 1B",
"MUA1163",
"Introduction to Professional Development",
"MUA1181",
"First Year Brass Class B",
"MUH1116",
"Communicating About Music II",
"MUT1122",
"Musical Concepts and Materials II",
"2014/2015 SEMESTER 1",
"MUA1109",
"Chamber Ensemble 1A",
"MUA2107",
"Large Ensembles 2A",
"MUA2153",
"Noon Recital Series 2A",
"MUA2161",
"Major Study 2A",
"MUA2180",
"Orchestral Repertoire for Brass 2A",
"MUH2115",
"Music and Context: Before 1800",
"MUL2101",
"Critical Thinking for Musicians",
"MUT2117",
"Musical Concepts and Materials III",
"2014/2015 SEMESTER 2",
"MUA1110",
"Chamber Ensemble 1B",
"MUA2108",
"Large Ensembles 2B",
"MUA2154",
"Noon Recital Series 2B",
"MUA2162",
"Major Study 2B",
"MUA2181",
"Orchestral Repertoire for Brass 2B",
"MUH2116",
"Music and Context: After 1800",
"MUT2118",
"Musical Concepts and Materials IV",
"SSY2223",
"Western Music within a Singaporean Context",
"2015/2016 SEMESTER 1",
"GEK1519",
"Science of Music",
"MUA2109",
"Chamber Ensemble 2A",
"MUA3105",
"Conducting",
"MUA3107",
"Large Ensembles 3A",
"MUA3153",
"Noon Recital Series 3A",
"MUA3161",
"Major Study 3A",
"MUA3181",
"Advanced Concepts in Orchestral Repertoire I",
"MUA3205",
"Materials of Jazz Music 1",
"MUH3203",
"History of Opera",
"2015/2016 SEMESTER 2",
"LAG1201",
"German 1",
"MUA2110",
"Chamber Ensemble 2B",
"MUA3108",
"Large Ensembles 3B",
"MUA3154",
"Noon Recital Series 3B",
"MUA3162",
"Major Study 3B",
"MUA3214",
"Introduction to Pedagogy",
"2016/2017 SEMESTER 1",
"GEK1054",
"Social and Cultural Studies through Music",
"GEM1003",
"Introduction to Theatre and Performance",
"MUA4162",
"Major Study 4B",
"MUA4219",
"Advanced Chamber Ensemble",
"2016/2017 SEMESTER 2"
]);
});
Loading